【发布时间】:2017-06-16 09:31:24
【问题描述】:
我正在尝试创建一个 DSC 脚本,该脚本可以在将成为只读域控制器的机器上本地运行。 xActiveDirectory DSC 资源不提供创建 RODC,因此我必须使用脚本资源并使用 Install-ADDSDomainController。
当我必须提供安全模式管理员密码时,我的问题就出现了。该参数将仅接受 SecureString,但是我无法将安全字符串传递给 DSC 配置。我可以为 Credential 参数传递一个 PSCredential 对象,但安全模式参数不接受它,所以我需要一个单独的变量。我正在使用自签名证书加密凭据,此时似乎可以正常工作。
我的 DSC 代码,在底部有几行注释掉的行,我在其中测试了创建安全字符串的替代方法,这些方法都不起作用:
get-childitem cert:\localmachine\my | where-object {$_.Subject -like "*CN=DscEncryptionCert*"} | remove-item
$cert = New-SelfSignedCertificate -Type DocumentEncryptionCertLegacyCsp -DnsName 'DscEncryptionCert' -HashAlgorithm SHA256
$cert | Export-Certificate -FilePath "c:\RODC\DscPublicKey.cer" -Force
$thumbprint = (get-childitem cert:\localmachine\my | where-object {$_.Subject -like "*CN=DscEncryptionCert*"}).Thumbprint
$ConfigData= @{
AllNodes = @(
@{
NodeName = "localhost"
CertificateFile = "C:\RODC\localhost.cer"
Thumbprint = $thumbprint
};
);
}
configuration RODC
{
param(
[Parameter()]$DomainName,
[Parameter()]$ReplicationSourceDC,
[Parameter()]$SiteName,
[Parameter()]$Thumbprint,
[PSCredential]$PSCredential = $PSCredential,
[Parameter(Mandatory=$true)]
[ValidateNotNullOrEmpty()]
[System.Security.SecureString]$safemodepassword = $safemodepassword
)
Import-DscResource -module 'PSDesiredStateConfiguration'
Node localhost
{
LocalConfigurationManager
{
CertificateId = $Thumbprint
}
WindowsFeature ADDSInstall
{
Ensure = 'Present'
Name = 'AD-Domain-Services'
IncludeAllSubFeature = $true
}
script installRODC
{
DependsOn = '[WindowsFeature]ADDSInstall'
SetScript =
{
Import-Module ADDSDeployment
Install-ADDSDomainController `
-AllowPasswordReplicationAccountName @("test\Allowed RODC Password Replication Group") `
-NoGlobalCatalog:$false `
-Credential:$PSCredential `
-CriticalReplicationOnly:$false `
-DenyPasswordReplicationAccountName @("BUILTIN\Administrators", "BUILTIN\Server Operators", "BUILTIN\Backup Operators", "BUILTIN\Account Operators", "test\Denied RODC Password Replication Group") `
-DomainName:$using:DomainName `
-InstallDns:$true `
-NoRebootOnCompletion:$false `
-ReadOnlyReplica:$true `
-ReplicationSourceDC:$using:ReplicationSourceDC `
-SiteName $using:SiteName `
-Force:$true `
-SafeModeAdministratorPassword:$safemodepassword
}
TestScript =
{
if((get-wmiobject win32_computersystem).domainrole -eq 4){$true}else{$false}
}
GetScript =
{
Return @{result = (get-wmiobject win32_computersystem).domainrole}
}
}
}
}
$PSCredential = Get-Credential
$safemodepassword = Read-Host -assecurestring "Please enter the Safe Mode Administrator password"
#$safemodepassword = ConvertTo-SecureString "P@55word" -AsPlainText -Force
#$safemodepassword = New-Object System.Management.Automation.PSCredential ("Administrator", $password)
RODC -DomainName test.local -ReplicationSourceDC DC1.test.local -Sitename Site11 -PSCredential $PSCredential -safemodepassword $safemodepassword
Set-DscLocalConfigurationManager -path .\RODC -Verbose -Force
Start-DscConfiguration -path .\RODC -Verbose -force
我写了一个简单的测试来检查脚本代码本身是否正常工作,它是:
$PSCredential = Get-Credential
$safemodepassword = Read-Host -assecurestring "Please enter the Safe Mode Administrator password"
$DomainName = "test.local"
$ReplicationSourceDC = "DC1.test.local"
$Sitename = "Site11"
Install-ADDSDomainController `
-AllowPasswordReplicationAccountName @("test\Allowed RODC Password Replication Group") `
-NoGlobalCatalog:$false `
-Credential:$PSCredential `
-CriticalReplicationOnly:$false `
-DenyPasswordReplicationAccountName @("BUILTIN\Administrators", "BUILTIN\Server Operators", "BUILTIN\Backup Operators", "BUILTIN\Account Operators", "test\Denied RODC Password Replication Group") `
-DomainName:$DomainName `
-InstallDns:$true `
-NoRebootOnCompletion:$false `
-ReadOnlyReplica:$true `
-ReplicationSourceDC:$ReplicationSourceDC `
-SiteName $SiteName `
-Force:$true `
-SafeModeAdministratorPassword:$safemodepassword
我得到的主要错误是:
PowerShell DSC 资源 MSFT_ScriptResource 未能执行 带有错误消息的 Set-TargetResource 功能:无法绑定 参数“SafeModeAdministratorPassword”到目标。例外 设置“SafeModeAdministratorPassword”: "SafeModeAdministratorPassword 不能为空。"
它是NULL,因为它没有被正确传递吗?如果我打印出变量的值,它会告诉我存在一个安全字符串,但实际 DSC 配置本身似乎并非如此。
如果我将 -SafeModeAdministratorPassword:$safemodepassword 更改为包含 $using,就像我对其他一些变量所做的那样,我会收到错误:
PowerShell DSC 资源 MSFT_ScriptResource 未能执行 带有错误消息的 Set-TargetResource 功能:异常调用 使用“1”参数“反序列化”:“系统找不到路径 指定。
我不确定我可以从这里去哪里。任何帮助,将不胜感激。谢谢。
【问题讨论】:
-
最简单的解决方法是在 dsc 配置中用常规字符串构造securestring(只是看看是否可行)。此外,在 ps 5+ 中调试 DSC 更容易,也许你应该使用它。 blogs.technet.microsoft.com/ashleymcglone/2016/10/26/…
标签: powershell dsc