如何用PowerShell调用AD「选择用户、计算机或组」对话框并传递选中项为变量
调用AD对象选择对话框并返回选中项(PowerShell实现)
完全可以用PowerShell调用你提到的AD原生选择对话框,还能把选中的对象存成变量供后续脚本使用。下面是两种可行的方案:
方案1:调用系统原生AD选择对话框(和AD组内的完全一致)
这种方法直接调用系统自带的组件,无需额外安装模块(前提是机器已安装AD管理工具):
Add-Type -AssemblyName System.DirectoryServices Add-Type -AssemblyName System.Windows.Forms # 获取域的默认命名上下文 $rootDSE = [ADSI]"LDAP://RootDSE" $defaultNC = $rootDSE.defaultNamingContext # 弹出原生选择对话框,支持选择用户、组、计算机 $selectedObjects = [ADSI]"LDAP://$defaultNC" | Select-Object -ExpandProperty Invoke("SelectUsers", $null, $null, $null, $null, 0, $null) if ($selectedObjects) { Write-Host "选中的AD对象:" $selectedADItems = @() foreach ($obj in $selectedObjects) { $name = $obj.Properties["name"].Value $dn = $obj.Properties["distinguishedName"].Value Write-Host "名称: $name | 可分辨名称: $dn" # 将对象信息存入数组变量,供后续脚本使用 $selectedADItems += [PSCustomObject]@{ Name = $name DistinguishedName = $dn } } } else { Write-Host "未选择任何对象" }
方案2:用AD模块+WinForms自定义对话框(更灵活)
如果已安装RSAT的AD PowerShell模块,可以自定义带列表的对话框,方便调整筛选规则:
# 加载AD模块 if (-not (Get-Module ActiveDirectory)) { Import-Module ActiveDirectory } Add-Type -AssemblyName System.Windows.Forms # 创建窗口 $form = New-Object System.Windows.Forms.Form $form.Text = "选择AD对象" $form.Size = New-Object System.Drawing.Size(600,400) $form.StartPosition = "CenterScreen" # 用于展示AD对象的列表框 $listBox = New-Object System.Windows.Forms.ListBox $listBox.Location = New-Object System.Drawing.Point(10,10) $listBox.Size = New-Object System.Drawing.Size(560,320) $listBox.SelectionMode = "MultiSimple" # 加载AD用户(替换为Get-ADGroup/Get-ADComputer即可选择组或计算机) Get-ADUser -Filter * -Properties Name, DistinguishedName | ForEach-Object { $listBox.Items.Add("$($_.Name) | $($_.DistinguishedName)") } # 确定按钮 $okBtn = New-Object System.Windows.Forms.Button $okBtn.Location = New-Object System.Drawing.Point(220,340) $okBtn.Size = New-Object System.Drawing.Size(75,23) $okBtn.Text = "确定" $okBtn.Add_Click({ $script:chosenItems = $listBox.SelectedItems $form.Close() }) # 取消按钮 $cancelBtn = New-Object System.Windows.Forms.Button $cancelBtn.Location = New-Object System.Drawing.Point(300,340) $cancelBtn.Size = New-Object System.Drawing.Size(75,23) $cancelBtn.Text = "取消" $cancelBtn.Add_Click({ $form.Close() }) # 将控件添加到窗口 $form.Controls.AddRange(@($listBox, $okBtn, $cancelBtn)) $form.ShowDialog() | Out-Null # 处理选中内容 if ($chosenItems) { Write-Host "选中的对象:" $selectedADItems = @() foreach ($item in $chosenItems) { $name, $dn = $item -split " \| " Write-Host "名称: $name | DN: $dn" $selectedADItems += [PSCustomObject]@{ Name = $name DistinguishedName = $dn } } } else { Write-Host "未选择任何对象" }
注意事项
- 方案1的对话框和AD组属性中点击「添加」弹出的完全一致,支持搜索、多选不同类型的AD对象。
- 两种方法都需要AD管理权限,且需在已加入域的机器或安装了RSAT AD工具的机器上运行。
- 方案1可通过调整参数或筛选规则,指定只显示用户/组/计算机,或同时显示多种类型。
内容的提问来源于stack exchange,提问作者bleepbloop
相关产品推荐
相关产品推荐

