【问题标题】:Can't change DSC LCM credential无法更改 DSC LCM 凭证
【发布时间】:2016-03-22 16:59:14
【问题描述】:

当尝试访问网络共享文件夹时,DSC 会返回“访问被拒绝”错误,尽管我已为其提供了有效的凭据。

我正在使用 DSC 配置,其中 DSC“脚本”资源如下:

Script myScriptResource {
        GetScript = {return $true}
        SetScript = {
            $setupShare = '\\SomeNetworkSharesFolder\subFolder'
            # This line produces valid results when run directly on node VM.
            $build = Get-ChildItem "FileSystem::$setupShare" -Name | Sort-Object -Descending | Select-Object -First 1 | Out-String
            Write-Host "Final Build: $build"
        }
        TestScript = {return $false} #Always run Set-Script block!
        Credential = $ValidNetworkShareCredential
        PsDscRunAsCredential = $ValidNetworkShareCredential
    }

我收到一个错误:

VERBOSE: [MyNodeVM]:                            [[Script]myScriptResource] Performing the operation "Set-TargetResource" on target "Executing t
he SetScript with the user supplied credential".
Access is denied
    + CategoryInfo          : PermissionDenied: (\\SomeNetworkSharesFolder\subFolder:) [], CimException
    + FullyQualifiedErrorId : ItemExistsUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetChildItemCommand
    + PSComputerName        : myNodeVM

这可能是因为节点 VM 上的 LCM 默认使用本地 SYSTEM 用户凭据。

我试图通过导航到 Windows 服务管理器手动更改用户凭据(提示:RUN 然后 services.msc),并在 属性的strong>登录选项卡。每次我尝试运行 Windows 远程管理 (WS-Managment) 服务时,都会收到错误消息:

Windows 无法在本地计算机上启动 Windows 远程管理 (WS-Management) 服务。 错误 1079:为该服务指定的帐户与为在同一进程中运行的其他服务指定的帐户不同。

我不知道如何更改 LCM 的凭据,以便它可以在执行 Get-ChildItem 时访问网络共享文件夹。

【问题讨论】:

  • 哪个版本的 PowerShell (DSC)? v5 支持更改 LCM 凭据。
  • v5 是我正在使用的。

标签: powershell windows-services credentials dsc powershell-5.0


【解决方案1】:
Script myScriptResource {
    GetScript = {return $true}
    SetScript = {
        $username ="someusername"
        $secpasswd = ConvertTo-SecureString “somepassword” -AsPlainText -Force
        $mycreds = New-Object System.Management.Automation.PSCredential ($username, $secpasswd)
        $setupShare = '\\SomeNetworkSharesFolder\subFolder'
        $psDriveArgs = @{ Name = ([guid]::NewGuid()); PSProvider = "FileSystem"; Root = $setupShare; Scope = "Private"; Credential = $mycreds }
        new-psdrive @psDriveArgs -ErrorAction Stop
        # This line produces valid results when run directly on node VM.
        $build = Get-ChildItem "FileSystem::$setupShare"  | Sort-Object -Descending | Select-Object -First 1 | Out-String
        Write-Host "Final Build: $build"
    }
    TestScript = {return $false} #Always run Set-Script block!
}

【讨论】:

  • 我认为在 .mof 文件中以纯文本形式传递我的密码不是一个好主意。
  • 不,它不是(我在上一条评论中提到,由于大小限制,我无法将它与我上一条评论一起使用),这就是 xFileUpload 使用证书加密凭证的原因。跨度>
【解决方案2】:

没有一种简单的方法可以使其与脚本资源一起使用,因为您需要能够将凭据传递给脚本资源,以便您可以安装驱动器并使用它来复制/粘贴。如果要从共享中复制文件/目录,可以使用“文件”资源。如果要将文件/目录复制到共享,可以使用 xPsDesiredStateConfiguration (https://gallery.technet.microsoft.com/xPSDesiredStateConfiguratio-417dc71d) 模块中的“xFileUpload”资源。如果您确实需要使用脚本资源来完成这项工作,请查看 xFileUpload 资源是如何完成的。

【讨论】:

  • 我能够使用“文件”资源从相同的网络共享执行复制任务而不会出错。但是,完整的“脚本”资源会获得一个子目录列表,这些子目录是多个按字母数字命名的构建文件夹,它会选择最新的构建文件夹来复制其内容。此操作无法使用“文件”资源完成。
  • 我认为最好修改 xFileUpload 资源(内部使用脚本资源并安全地传递凭据)以满足您的需要。
  • 没用!我花了一整天的时间尝试您建议的解决方法。它需要指纹,我没有在我的 DSC 框架中使用证书。我的意思是,Script 资源的源代码必须与 xUploadFile 模块中的源代码相似,否则如果 Script 资源不使用它们来执行脚本,为什么还要接受凭据参数!!!
  • 如果您在原始脚本中使用plainTextPassword(不推荐),请在xFileUpload 中仅使用纯文本密码。
  • 如果您在原始脚本中使用plainTextPassword(不推荐),请在xFileUpload 中仅使用纯文本密码。您需要能够使用脚本资源中提供的凭据显式安装驱动器(而不是通过脚本资源的凭据属性)。这就是 xUploadFile 正在做的事情。使其与您的示例一起使用的其他方法是传递用户名、密码(尽管您必须担心保护它们)并使用它们来创建 new-psdrive,然后您就可以访问它。下一条评论中的示例。
猜你喜欢
  • 2016-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-30
相关资源
最近更新 更多