我有一个 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
什么原因造成此情况?
- 我已经确保只有一我的所有文件夹中的模块副本
$env:PSModulePath
。 - 某些东西似乎正在工作;它可以在错误消息中确定我的模块的正确版本(当我更改模块文件上的版本时
.psd1
,错误消息中报告的版本也会更改) - 我不认为这与为什么 DSC 找不到已安装的资源?因为我使用的是推送模式,并且没有模块版本问题。
这可能与 中的非标准条目有关吗
$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
- 也许是我的目录布局有问题?我实际上还没有见过包含多个基于类的 DSC 资源的模块示例,所以我对布局有点猜测。
- (如果有这种模块的示例 - 一个包含多个基于类的 DSC 资源的单个模块 - 那么它的链接将非常有帮助。)
最后,我在 Windows 10 上使用 Powershell 5.1,并从 Windows Update 应用所有更新。(最终,我将在 Server 2016 计算机上部署我的配置。)
我还可能错过什么?
答案1
处理 DSC 配置在系统帐户下运行,因此不会搜索特定用户的 PSModulePath。将模块放在标准位置之一,通常在 下$env:ProgramFiles\WindowsPowerShell\Modules
。
当您说您修改了您的时$env:PSModulePath
,我假设您是为您当前用户进行的修改,而不是修改机器范围的设置。
如果您需要资源来访问特定用户可用的资源,则某些资源将允许将凭证对象作为参数传递给资源。