对于期望状态配置文件资源,为什么Credential工作,而PsDscRunAsCredential不工作?

时间:2018-04-04 21:56:20

标签: powershell credentials dsc

我正在尝试学习如何在PowerShell所需状态配置中使用凭据,而且我无法理解资源的CredentialPsDscRunAsCredential属性之间的区别。

作为一个简单的测试用例,我正在尝试将文件夹及其内容从文件共享复制到目标节点上的本地文件夹。目标节点的计算机帐户无权访问共享,因此我提供了具有访问权限的凭据。如果我将凭据分配给文件资源的Credential属性,则它可以正常工作。如果我使用PsDscRunAsCredential属性,则在尝试访问文件共享时会出现“访问被拒绝”错误。

Configuration FileWithCredential {

    Import-DscResource -ModuleName PSDesiredStateConfiguration

    Node $AllNodes.NodeName {

        # copy files from a file share to a new folder on the target node
        File CopyFileShareFolder {
            Ensure = 'Present'
            Type = 'Directory'
            Recurse = $true
            SourcePath = '\\fileshare\folder\subfolder\stuff_I_want_to_copy'
            DestinationPath = 'c:\ps\DSC\filesharedestination'
            # If I use Credential instead of PsDscRunAsCredential, it works
            # Credential = Get-Credential -UserName ourdomain\myaccout -Message 'Enter Password'
            PsDscRunAsCredential = Get-Credential -UserName ourdomain\myaccout -Message 'Enter Password'
        }
    }
}

$ConfigData = @{
    AllNodes = @(
        @{
            NodeName = 'target-server'
            PsDscAllowDomainUser = $true
            PsDscAllowPlainTextPassword = $true
        }
    )
}

我正在Windows 10上编辑MOF并将配置推送到Server 2016框。两者都运行PowerShell 5.1。

PS C:\Users\me\Documents\pscode\dsc_test2> FileWithCredential -ConfigurationData $ConfigData
PS C:\Users\me\Documents\pscode\dsc_test2> Start-DscConfiguration .\FileWithCredential\ -Verbose -Wait -Force

我知道PsDscRunAsCredential是新的,我假设有理由比旧Credential更喜欢它,但我无法弄清楚真正的差异是什么。它们基本可以互换吗?如果没有,我错过了哪些会使“运行”凭证有效?

注意:我理解允许纯文本密码的安全风险,但是现在我只是想了解如何传递凭据并确保它们正常工作。我的名单上接下来就是学习如何安全地学习。

3 个答案:

答案 0 :(得分:2)

看起来我的预感可能是正确的;将我的评论转化为答案:

  

我只是想一想:File资源有点特别。它' S   作为二进制实现的唯一资源之一。它有些奇怪   你跑步时没有回复ModuleName的怪癖   Get-DscResource。也许它以LCM无法实现的方式实施   改变其背景。 It would be interesting to turn on debugging for DSC, then break into the debugger   并检查您的上下文,尝试访问共享和本地文件   系统等。

在运行测试时,File资源似乎无法正常支持PsDscRunAsCredential

使用Invoke-DscResource进行演示,将FileScript进行比较,并显示生成的文件的所有者不同。

使用File,所有者始终为SYSTEM

对于Script,所有者在没有凭据(预期)的情况下运行时为SYSTEM,但在使用凭据运行时,所有者是不同的(在我的情况下,所有者成为本地{{}} 1}} group,因为我提供的凭据是本地管理员。)

Administrators

答案 1 :(得分:2)

@briantist指出File是一种特殊的资源是正确的...它在C ++中实现为WMI资源。其他的开箱即用资源是 在PowerShell中实现(Log除外,它在DSC引擎本身内实现)。

WMI资源没有得到普及,File是唯一以这种方式实现的资源。

PsDscRunAsCredential是针对PowerShell资源实现的,但不适用于WMI资源。这就是它不适用于File的原因。

此外,File的Credential属性比PsDscRunAsCredential更有限:它仅用于访问网络共享中的文件。

我会跟进将此信息添加到我们的文档中。谢谢你指出这一点。

答案 2 :(得分:0)

请参阅文章ConfigData Credentials,特别是

  

默认情况下,DSC配置资源作为本地系统运行。然而,   某些资源需要凭证,例如Package时   资源需要在特定用户帐户下安装软件。

     

早期的资源使用硬编码的Credential属性名来处理   这个。 WMF 5.0为所有人添加了自动PsDscRunAsCredential属性   资源。有关使用PsDscRunAsCredential的信息,请参阅   使用用户凭据运行DSC。更新的资源和习惯   资源可以使用此自动属性而不是创建它们   拥有凭证的财产。