You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 16:03:21