使用 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'))]"

/纳文