使用 ARM 模板配置 Azure VM 时添加本地 AD 组 -Azure 虚拟桌面
Add onprem AD group while provisioning Azure VM with ARM template -Azure virtual desktop
我需要使用 ARM 模板配置 Azure VM,包括创建机器、添加域加入、注册主机池、启用 Azure 磁盘加密。我们将使用图像。
我最后尝试使用自定义扩展脚本 运行 一个 ps1 可以将机器对象添加到广告组。
脚本 1
$SysInfo = New-Object -ComObject "ADSystemInfo"
$ComputerDN = $SysInfo.GetType().InvokeMember("ComputerName",
"GetProperty", $Null, $SysInfo,
$Null)
#$ComputerDN =
([ADSISEARCHER]"sAMAccountName=$($env:COMPUTERNAME)$").FindOne().Path
$ComputerDN
$Group = "groupname"
$group1dn= ([ADSISEARCHER]"sAMAccountName=$($Group)").FindOne().Path
$Groupdn = [ADSI]"$group1dn"
// Check if computer already a member of the group.
If ($Groupdn.IsMember("LDAP://$ComputerDN") -eq $False)
{
# Add the computer to the group.
$Groupdn.Add("LDAP://$ComputerDN")
}
Script2
$credential= "domain/user & password"
Start-Process
"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -Credential
$credential -ArgumentList "-file <path of script1>"
**OR**
Invoke-Command -FilePath <path of script1>-Credential $credential -
ComputerName localhost
两个 ps1 通过 CSE 下载到机器并触发第二个脚本2
对于启动过程,它表示访问被拒绝(因为 CSE 运行 的系统帐户并且可能无法更改域用户。)
调用命令可以模拟,但是,它需要将 domain/user 添加到 localadmin 用户组并在机器上启用 psremoting,尽管这样做仍然有问题。
Exception calling "InvokeMember" with "5" argument(s): "Access is denied.
The following exception occurred while retrieving member "IsMember": "An operations error occurred.
"
如何使用 CSE 完成此操作?
为了稍微简化 script1,您可以尝试使用 WinNT 名称并跳过搜索 AD:
$Group = "Domain Computers"
$Domain = 'CONTOSO' # NETBIOS name
$ADGroup = [ADSI]"WinNT://$Domain/$Group"
# Check if computer already a member of the group. Computer accounts get $ at the end
If (-not ($ADGroup.isMember("WinNT://$Domain/$env:COMPUTERNAME$"))) {
# Add the computer to the group.
$Groupdn.Add("LDAP://$ComputerDN")
}
script2 的 Start-Process
应该没问题,只要虚拟机已经加入域,并且 cred 用户名采用 DOMAIN\user
格式。例如,您可以尝试测试下面的命令 - 没有变量,只需填写名称。
获取已启动进程的输出可能会很痛苦。我在 shell window 中添加了 ;Read-Host 'waiting'
来测试 true/false 输出。如果您不能 运行 交互,您可以使用 -RedirectStandardOutput 'c:\folder\result.out'
并检查文件
$Credential = Get-Credential CONTOSO\user
Start-Process powershell.exe -Cred $Credential -Wait -Arg `
"-C ([ADSI]'WinNT://CONTOSO/Domain Computers').isMember('WinNT://CONTOSO/MyHostname$')"
在我的 PC 上,这 returns 是一个错误 start-process : Access is denied
,但确实成功地模拟了我的域用户并启动了该过程...所以我不确定它的交易是什么。
Invoke-Command
适用于机器本地的任何东西, 但 它仍然算作远程处理。由于 second-hop 限制,isMember()
无法对您的 AD 服务进行身份验证。这种行为can be changed,但不推荐。
我明白了..谢谢你的建议Cpt.Whale。
我在 CSE 中只使用了脚本 1(需要域密码参数)- 加入域后在计算机上下载。
然后使用 CSE 中的受保护设置 运行 ps1 并传递 keyvault 引用。
"commandToExecute": "[concat('powershell.exe -file Scrip1.ps1',' -password(脚本1中的参数),参数('keyvaultpass'))]"
/纳文
我需要使用 ARM 模板配置 Azure VM,包括创建机器、添加域加入、注册主机池、启用 Azure 磁盘加密。我们将使用图像。 我最后尝试使用自定义扩展脚本 运行 一个 ps1 可以将机器对象添加到广告组。
脚本 1
$SysInfo = New-Object -ComObject "ADSystemInfo"
$ComputerDN = $SysInfo.GetType().InvokeMember("ComputerName",
"GetProperty", $Null, $SysInfo,
$Null)
#$ComputerDN =
([ADSISEARCHER]"sAMAccountName=$($env:COMPUTERNAME)$").FindOne().Path
$ComputerDN
$Group = "groupname"
$group1dn= ([ADSISEARCHER]"sAMAccountName=$($Group)").FindOne().Path
$Groupdn = [ADSI]"$group1dn"
// Check if computer already a member of the group.
If ($Groupdn.IsMember("LDAP://$ComputerDN") -eq $False)
{
# Add the computer to the group.
$Groupdn.Add("LDAP://$ComputerDN")
}
Script2
$credential= "domain/user & password"
Start-Process
"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -Credential
$credential -ArgumentList "-file <path of script1>"
**OR**
Invoke-Command -FilePath <path of script1>-Credential $credential -
ComputerName localhost
两个 ps1 通过 CSE 下载到机器并触发第二个脚本2
对于启动过程,它表示访问被拒绝(因为 CSE 运行 的系统帐户并且可能无法更改域用户。) 调用命令可以模拟,但是,它需要将 domain/user 添加到 localadmin 用户组并在机器上启用 psremoting,尽管这样做仍然有问题。
Exception calling "InvokeMember" with "5" argument(s): "Access is denied.
The following exception occurred while retrieving member "IsMember": "An operations error occurred. "
如何使用 CSE 完成此操作?
为了稍微简化 script1,您可以尝试使用 WinNT 名称并跳过搜索 AD:
$Group = "Domain Computers"
$Domain = 'CONTOSO' # NETBIOS name
$ADGroup = [ADSI]"WinNT://$Domain/$Group"
# Check if computer already a member of the group. Computer accounts get $ at the end
If (-not ($ADGroup.isMember("WinNT://$Domain/$env:COMPUTERNAME$"))) {
# Add the computer to the group.
$Groupdn.Add("LDAP://$ComputerDN")
}
script2 的 Start-Process
应该没问题,只要虚拟机已经加入域,并且 cred 用户名采用 DOMAIN\user
格式。例如,您可以尝试测试下面的命令 - 没有变量,只需填写名称。
获取已启动进程的输出可能会很痛苦。我在 shell window 中添加了 ;Read-Host 'waiting'
来测试 true/false 输出。如果您不能 运行 交互,您可以使用 -RedirectStandardOutput 'c:\folder\result.out'
并检查文件
$Credential = Get-Credential CONTOSO\user
Start-Process powershell.exe -Cred $Credential -Wait -Arg `
"-C ([ADSI]'WinNT://CONTOSO/Domain Computers').isMember('WinNT://CONTOSO/MyHostname$')"
在我的 PC 上,这 returns 是一个错误 start-process : Access is denied
,但确实成功地模拟了我的域用户并启动了该过程...所以我不确定它的交易是什么。
Invoke-Command
适用于机器本地的任何东西, 但 它仍然算作远程处理。由于 second-hop 限制,isMember()
无法对您的 AD 服务进行身份验证。这种行为can be changed,但不推荐。
我明白了..谢谢你的建议Cpt.Whale。
我在 CSE 中只使用了脚本 1(需要域密码参数)- 加入域后在计算机上下载。 然后使用 CSE 中的受保护设置 运行 ps1 并传递 keyvault 引用。 "commandToExecute": "[concat('powershell.exe -file Scrip1.ps1',' -password(脚本1中的参数),参数('keyvaultpass'))]"
/纳文