Powershell:如何让Powershell在使用已知名称搜索时为您提供选择正确用户的选项
我创建了一个Powershell脚本,该脚本从CSV查找用户名中获取显示名称,然后将它们添加到AD中的安全组中 问题是显示名称相同的人。我的脚本当它点击相同的显示名称时,它将只添加每个具有该显示名称的用户名 我想要一个选项,当它点击一个返回多个用户名的名称时,它会显示一个选项,允许某人选择正确的用户名,然后将其添加到安全组 我是PowerShell的新手,在这一点上有点困难,因此非常感谢您的帮助Powershell:如何让Powershell在使用已知名称搜索时为您提供选择正确用户的选项,powershell,active-directory,powershell-3.0,Powershell,Active Directory,Powershell 3.0,我创建了一个Powershell脚本,该脚本从CSV查找用户名中获取显示名称,然后将它们添加到AD中的安全组中 问题是显示名称相同的人。我的脚本当它点击相同的显示名称时,它将只添加每个具有该显示名称的用户名 我想要一个选项,当它点击一个返回多个用户名的名称时,它会显示一个选项,允许某人选择正确的用户名,然后将其添加到安全组 我是PowerShell的新手,在这一点上有点困难,因此非常感谢您的帮助 Import-Module ActiveDirectory [void] [System.Refle
Import-Module ActiveDirectory
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
$Form = New-Object System.Windows.Forms.Form
$Form.Text = "Security Group Tool"
$Form.Size = New-Object System.Drawing.Size(390,150)
$Form.StartPosition = "CenterScreen"
$Form.KeyPreview = $True
$Form.MaximumSize = $Form.Size
$Form.MinimumSize = $Form.Size
$Icon = New-Object System.Drawing.Icon("H:\test\favicon.ico")
$Form.Icon = $Icon
$label = New-Object System.Windows.Forms.Label
$label.Location = New-Object System.Drawing.Size(10, 10)
$label.Size = New-Object System.Drawing.Size(400, 15)
$label.Text = "Please enter The name of the Security Group You want to add users too"
$Form.Controls.Add($label)
$textbox = New-Object System.Windows.Forms.TextBox
$textbox.Location = New-Object System.Drawing.Size(10,50)
$textbox.Size = New-Object System.Drawing.Size(240,40)
$Form.Controls.Add($textbox)
$test = {
$secgrp = $textbox.Text
$Sam = @()
$names = Import-Csv "H:\test\Groups2.csv"
foreach ($name in $names.DisplayName) {
$Sam += Get-ADUser -Filter { Name -like $name } -Properties SamAccountName | Select-Object SamAccountName
}
$User = $Sam
foreach ($User in $User) {
Add-ADGroupMember -Identity $secgrp -Members $User
}
}
$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = New-Object System.Drawing.Size(260,45)
$OKButton.Size = New-Object System.Drawing.Size(75,30)
$OKButton.Text = "OK"
$OKButton.Add_Click($test)
$Form.Controls.Add($OKButton)
$Form.Add_KeyDown({
if ($_.KeyCode -eq "Enter") {
& $test
}
})
$Form.Add_KeyDown({
if ($_.KeyCode -eq "Escape") {
$Form.Close()
}
})
$Form.TopMost = $True
$Form.Add_Shown({ $Form.Activate() })
[void] $Form.ShowDialog()
您可以使用
Count
属性检查Get ADUser
返回的用户数。这将告诉您返回了多少对象(用户)
如果有多个用户,可以使用Out GridView
显示弹出对话框,从列表中选择所需结果:
默认情况下,这允许多个选择,但添加-outputmodesingle
将只允许选择单个选择
您的脚本可以按如下方式更新:
$test = {
$secgrp = $textbox.Text
$Users = New-Object System.Collections.ArrayList
$names = Import-Csv "H:\test\Groups2.csv"
foreach ($name in $names.DisplayName) {
$ReturnedUser = Get-ADUser -Filter { Name -like $name } -Properties SamAccountName | Select-Object -ExpandProperty SamAccountName
if ($ReturnedUser.count > 1) {
$SelectedUser = $ReturnedUser | Out-GridView -Title "Multiple Users have matched, select User to process" -OutputMode Single
$null = $Users.Add($SelectedUser) #this syntax surpresses the .Add() from displaying the index of each item added
}
else {
$null = $Users.Add($ReturnedUser)
}
}
foreach ($User in $Users) {
Add-ADGroupMember -Identity $secgrp -Members $User
}
}
您可以使用
Count
属性检查Get ADUser
返回的用户数。这将告诉您返回了多少对象(用户)
如果有多个用户,可以使用Out GridView
显示弹出对话框,从列表中选择所需结果:
默认情况下,这允许多个选择,但添加-outputmodesingle
将只允许选择单个选择
您的脚本可以按如下方式更新:
$test = {
$secgrp = $textbox.Text
$Users = New-Object System.Collections.ArrayList
$names = Import-Csv "H:\test\Groups2.csv"
foreach ($name in $names.DisplayName) {
$ReturnedUser = Get-ADUser -Filter { Name -like $name } -Properties SamAccountName | Select-Object -ExpandProperty SamAccountName
if ($ReturnedUser.count > 1) {
$SelectedUser = $ReturnedUser | Out-GridView -Title "Multiple Users have matched, select User to process" -OutputMode Single
$null = $Users.Add($SelectedUser) #this syntax surpresses the .Add() from displaying the index of each item added
}
else {
$null = $Users.Add($ReturnedUser)
}
}
foreach ($User in $Users) {
Add-ADGroupMember -Identity $secgrp -Members $User
}
}
这是一个完美而正确的解决方案,伊姆霍。我来这里的目的正是想写下这个问题的答案,good work@James.Small update to
Select Object-ExpandProperty-SamAccountName
,还有foreach($User in$User)
不好,所以我也更新了。如果我很愚蠢,我很抱歉。还在找我的脚呢!:我试着把那段代码插入到我的脚本中,但它还是把所有人都加入了这个组。因此,我在没有任何脚本剩余部分的情况下尝试了代码,结果代码出错了。补充:不用担心,詹姆斯,代码中实际上有一个错误。我们应该使用System.Collections.ArrayList
而不是Array
,这就是出现此错误的原因@JamesC.,我已经编辑了使用ArrayList而不是数组来解决这个问题的代码。谢谢,我已经注意到了这一点,并且解决了我现在在实际显示时遇到的问题。当我运行它时,将不显示出栅格视图。如果我运行纸条,然后说出它显示的网格返回用户?非常感谢您的帮助这是一个完美而正确的解决方案,IMHO。我来这里的目的正是想写下这个问题的答案,good work@James.Small update toSelect Object-ExpandProperty-SamAccountName
,还有foreach($User in$User)
不好,所以我也更新了。如果我很愚蠢,我很抱歉。还在找我的脚呢!:我试着把那段代码插入到我的脚本中,但它还是把所有人都加入了这个组。因此,我在没有任何脚本剩余部分的情况下尝试了代码,结果代码出错了。补充:不用担心,詹姆斯,代码中实际上有一个错误。我们应该使用System.Collections.ArrayList
而不是Array
,这就是出现此错误的原因@JamesC.,我已经编辑了使用ArrayList而不是数组来解决这个问题的代码。谢谢,我已经注意到了这一点,并且解决了我现在在实际显示时遇到的问题。当我运行它时,将不显示出栅格视图。如果我运行纸条,然后说出它显示的网格返回用户?非常感谢你的帮助