我们知道,DSC的资源中,有很多的资源是需要访问文件共享目录,进入本地的用户的目录,或者为一个特定的用户安装一个MSI的安装包,修改注册表;这个时候,如果直接执行调用DSC的资源,则可能会弹出“Access is Denied” 错误或者异常。这个时候就需要在生成的MOF文件里面制定其访问的权限;因为默认的情况下,DSC是通过系统的账号(System account)运行资源的。解决方案就是在PowerShell DSC 5.x中,每一个资源都会默认支持PsDscRunAsCredential的属性。通过PsDscRunAsCredential属性,可以指定其用用户账号或者域账号运行DSC的资源。比如通过下面的命令,我们可以查看到 Group的DSC资源里面就包括一个PsDscRunAsCredential的属性。
PS C:\dsc> Get-DscResource -Name Group -Syntax
Group [String] #ResourceName
{
GroupName = [string]
[Credential = [PSCredential]]
[DependsOn = [string[]]]
[Description = [string]]
[Ensure = [string]{ Absent | Present }]
[Members = [string[]]]
[MembersToExclude = [string[]]]
[MembersToInclude = [string[]]]
[PsDscRunAsCredential = [PSCredential]]
}
下面是一个例子,用来通过修改注册表,来修改用户的CMD命令行的背景颜色的。
Configuration ChangeCmdBackGroundColor
{
Import-DscResource -ModuleName PSDesiredStateConfiguration
Node $AllNodes.NodeName
{
Registry CmdPath
{
Key = 'HKEY_CURRENT_USER\SOFTWARE\Microsoft\Command Processor'
ValueName = 'DefaultColor'
ValueData = '1F'
ValueType = 'DWORD'
Ensure = 'Present'
Force = $true
Hex = $true
PsDscRunAsCredential = Get-Credential
}
}
}
$configData = @{
AllNodes = @(
@{
NodeName = 'localhost';
PSDscAllowPlainTextPassword = $true
}
)
}
ChangeCmdBackGroundColor -ConfigurationData $configData
通过上 PsDscRunAsCredential = Get-Credential的配置,需要我们在把DSC 配置文件转换成MOF文件的时候,输入用户名和密码。
我们注意到,输入用户名和密码后,其用户名和密码会保存在MOF文件中。
instance of MSFT_Credential as $MSFT_Credential1ref
{
Password = "123456";
UserName = "admin";
};
instance of MSFT_RegistryResource as $MSFT_RegistryResource1ref
{
ResourceID = "[Registry]CmdPath";
ValueName = "DefaultColor";
PsDscRunAsCredential = $MSFT_Credential1ref;
Key = "HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Command Processor";
Ensure = "Present";
Force = True;
SourceInfo = "C:\\DSC\\ChangeCmdBackGroundColor.ps1::7::9::Registry";
ValueType = "Dword";
ModuleName = "PSDesiredStateConfiguration";
ValueData = {
"1F"
};
Hex = True;
ModuleVersion = "0.0";
ConfigurationName = "ChangeCmdBackGroundColor";
};
instance of OMI_ConfigurationDocument{
Version="2.0.0";
MinimumCompatibleVersion = "2.0.0";
CompatibleVersionAdditionalProperties= {"Omi_BaseResource:ConfigurationName"};
Author="Admin";
GenerationDate="02/21/2017 03:07:04";
GenerationHost="PULL51W2K12NSSL";
Name="ChangeCmdBackGroundColor";
};
上面的脚本会直接弹出一个输入用户名和密码的认证框,如何把用户名和密码的认证信息通过写入到文本文件中,直接传入到MOF文件里面呢? 请看下面的配置。
$password = "ThisIsAPlaintextPassword" | ConvertTo-SecureString -asPlainText -Force
$username = "User1"
[PSCredential] $credential = New-Object System.Management.Automation.PSCredential($username,$password)
Configuration ChangeCmdBackGroundColor
{
Import-DscResource -ModuleName PSDesiredStateConfiguration
Node $AllNodes.NodeName
{
Registry CmdPath
{
Key = 'HKEY_CURRENT_USER\SOFTWARE\Microsoft\Command Processor'
ValueName = 'DefaultColor'
ValueData = '1F'
ValueType = 'DWORD'
Ensure = 'Present'
Force = $true
Hex = $true
PsDscRunAsCredential = $credential
}
}
}
$configData = @{
AllNodes = @(
@{
NodeName = 'localhost';
PSDscAllowPlainTextPassword = $true
}
)
}
ChangeCmdBackGroundColor -ConfigurationData $configData
我们知道,把密码直接放在MOF文件里面是十分不安全的。那么如何把MOF文件的里面的密码通过证书加密,保护起来?这样的话,即使
有恶意攻击者获取到MOF文件以后,因为其不知道其密码,也不能执行其脚本,这样其安全性就会大大提高。欲知详情,敬请查看回分解。