我尝试使用模板和DSC在Azure中自动构建Windows VM。我的同事熟悉模板但不熟悉PowerShell,我希望尽可能少地与DSC交互或运行cmdlet。如果我无法使用模板执行所有操作,我想使用Azure门户。
我很难找到一种非PowerShell方式将用户和组添加到本地Administrators组。我认为最简单的过程是:
模板有一个名为membersOfLocalAdmins
的参数。它的值将是一个单独的字符串,如mydomain\username,mydomain\groupname...
。
模板在自动化帐户中创建一个名为membersOfLocalAdmins-*New VM Name*
的变量。它的值是管理员字符串。
DSC配置需要读取此变量。它目前有一个VM名称的参数。在Azure门户中,我们将转到自动化帐户,选择配置并单击“编译”。我们看到VM名称的提示并键入它,单击“确定”。
DSC配置必须读取名为membersOfLocalAdmins-*New VM Name*
的自动化帐户变量。然后将变量的值拆分为一个数组,并将其转换为其Group资源。我已尝试过类似下面的代码,但它不会编译,我认为配置中我可以使用PowerShell的唯一位置是脚本资源。有没有办法做到这一点,或者更好的方式?
我还遇到了Azure门户中的编译DSC配置表格无法接受数组的问题。它显示为mydomain\username,mydomain\groupname...
作为单个字符串。如果我可以使用PowerShell在它到达Group资源之前拆分它,那也没关系。但是我会在配置中放置这个PowerShell吗?
我想我将不得不使用脚本资源,将字符串拆分为数组并自行添加到管理员。凌乱。
$DomainUserName = Get-AutomationVariable -Name 'Internal_Domain_Username'
$DomainUserPassword = Get-AutomationVariable -Name 'Internal_Domain_Password'
$DomainCredential = New-Object -TypeName System.Management.Automation.PSCredential($DomainUserName, (ConvertTo-SecureString $DomainUserPassword -AsPlainText -Force))
Configuration TestConfiguration1Win10 {
param(
[string[]]$ComputerName = "localhost"
,
[string[]]$membersOfLocalAdmins
)
# This if statement here causes the compile to fail. Is there anywhere else in the configuration I could put it?
if (!$membersOfLocalAdmins){
$membersOfLocalAdmins = $(Get-AutomationVariable -Name "membersOfLocalAdmins-@($ComputerName)[0]").Split(',')
}
Import-DscResource –ModuleName 'PSDesiredStateConfiguration'
Import-DSCResource -Module xNetworking -Name xFirewallProfile
Import-DSCResource -Module xSystemSecurity -Name xIEEsc
Import-DscResource -ModuleName DeleteDscTmpFile
Node $ComputerName {
Group AddToLocalAdmins {
GroupName ='Administrators'
Ensure = 'Present'
MembersToInclude = $membersOfLocalAdmins
Credential = $DomainCredential
}
答案 0 :(得分:1)
删除$ membersOfLocalAdmins参数并更改组资源,如下所示。
Group AddToLocalAdmins {
GroupName ='Administrators'
Ensure = 'Present'
MembersToInclude = $((Get-AutomationVariable -Name "membersOfLocalAdmins-$ComputerName").Split(',').Trim())
Credential = $DomainCredential
}