为什么我不能从安装在用户模块路径中的模块以推送模式使用 DSC 资源?

为什么我不能从安装在用户模块路径中的模块以推送模式使用 DSC 资源?

我有一个 Powershell DSC 自定义资源,嵌入在模块中。完整代码如下可在此处获得如果你想看到它,但这可能没有必要;我的问题不是(我认为)在我写的代码中,而是在于如何访问它。

就我而言,我使用的是 DSC 推送模式。我使用一个普通的 Powershell 脚本来安装所需的模块、编译配置并启动它。在该脚本中,我将模块的位置添加到$env:PSModulePath。完成此操作后,我可以看到该模块并将其导入到我的交互式 shell 中,如下所示:

PS> Get-Module -ListAvailable | Where-Object -Property Name -eq cWinTrialLab | Import-Module
PS> Get-DscResource -Module cWinTrialLab

ImplementedAs   Name                      ModuleName                     Version    Properties
-------------   ----                      ----------                     -------    ----------
PowerShell      cWtlShortcut              cWinTrialLab                   0.0.1      {Ensure, ShortcutPath, TargetPath, DependsOn...}

所以我创建了一个测试配置文件:

Configuration TestConfig {

    Import-DscResource -ModuleName PSDesiredStateConfiguration
    Import-DscResource -ModuleName cWinTrialLab

    Node localhost {

        cWtlShortcut "TestShortcut" {
            Ensure = "Present"
            ShortcutPath = "$env:USERPROFILE\Desktop\TestShortcut.lnk"
            TargetPath = "C:\Windows\system32\cmd.exe"
        }

    }
}

我尝试使用它:

PS> . .\testDscConfig.ps1
PS> TestConfig
PS> Start-DscConfiguration -Wait -Force TestConfig

编译 MOF 似乎有效,但实际上启动配置失败,并显示:

The PowerShell DSC resource cWtlShortcut from module <cWinTrialLab,0.0.1> does not exist at the PowerShell module path nor is it registered as a WMI DSC resource.
At $Home\Documents\psyops\submod\wintriallab\azure\test.ps1:13 char:1
+ Start-DscConfiguration -Wait -Force TestConfig
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (root/Microsoft/...gurationManager:String) [], CimException
    + FullyQualifiedErrorId : DscResourceNotFound
    + PSComputerName        : localhost

什么原因造成此情况?

  1. 我已经确保只有我的所有文件夹中的模块副本$env:PSModulePath
  2. 某些东西似乎正在工作;它可以在错误消息中确定我的模块的正确版本(当我更改模块文件上的版本时.psd1,错误消息中报告的版本也会更改)
  3. 我不认为这与为什么 DSC 找不到已安装的资源?因为我使用的是推送模式,并且没有模块版本问题。
  4. 这可能与 中的非标准条目有关吗$env:PSModulePath?我尝试将模块复制到$env:ProgramFiles\WindowsPowershell\Modules,但随后出现错误真的不明白: Importing module cWinTrialLab failed with error - File C:\Program Files\WindowsPowerShell\Modules\cWinTrialLab\cWtlShortcut\cWtlShortcut.psm1 cannot be loaded because running scripts is disabled on this system. For more information, see about_Execution_Policies。记录如下:

    PS> Get-ExecutionPolicy -List
            Scope ExecutionPolicy
            ----- ---------------
    MachinePolicy       Undefined
       UserPolicy       Undefined
          Process       Undefined
      CurrentUser    Unrestricted
     LocalMachine    Unrestricted
    
  5. 也许是我的目录布局有问题?我实际上还没有见过包含多个基于类的 DSC 资源的模块示例,所以我对布局有点猜测。
  6. (如果有这种模块的示例 - 一个包含多个基于类的 DSC 资源的单个模块 - 那么它的链接将非常有帮助。)

最后,我在 Windows 10 上使用 Powershell 5.1,并从 Windows Update 应用所有更新。(最终,我将在 Server 2016 计算机上部署我的配置。)

我还可能错过什么?

答案1

处理 DSC 配置在系统帐户下运行,因此不会搜索特定用户的 PSModulePath。将模块放在标准位置之一,通常在 下$env:ProgramFiles\WindowsPowerShell\Modules

当您说您修改了您的时$env:PSModulePath,我假设您是为您当前用户进行的修改,而不是修改机器范围的设置。

如果您需要资源来访问特定用户可用的资源,则某些资源将允许将凭证对象作为参数传递给资源。

相关内容