Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell:如何让Powershell在使用已知名称搜索时为您提供选择正确用户的选项_Powershell_Active Directory_Powershell 3.0 - Fatal编程技术网

Powershell:如何让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

我创建了一个Powershell脚本,该脚本从CSV查找用户名中获取显示名称,然后将它们添加到AD中的安全组中

问题是显示名称相同的人。我的脚本当它点击相同的显示名称时,它将只添加每个具有该显示名称的用户名

我想要一个选项,当它点击一个返回多个用户名的名称时,它会显示一个选项,允许某人选择正确的用户名,然后将其添加到安全组

我是PowerShell的新手,在这一点上有点困难,因此非常感谢您的帮助

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 to
Select Object-ExpandProperty-SamAccountName
,还有
foreach($User in$User)
不好,所以我也更新了。如果我很愚蠢,我很抱歉。还在找我的脚呢!:我试着把那段代码插入到我的脚本中,但它还是把所有人都加入了这个组。因此,我在没有任何脚本剩余部分的情况下尝试了代码,结果代码出错了。补充:不用担心,詹姆斯,代码中实际上有一个错误。我们应该使用
System.Collections.ArrayList
而不是
Array
,这就是出现此错误的原因@JamesC.,我已经编辑了使用ArrayList而不是数组来解决这个问题的代码。谢谢,我已经注意到了这一点,并且解决了我现在在实际显示时遇到的问题。当我运行它时,将不显示出栅格视图。如果我运行纸条,然后说出它显示的网格返回用户?非常感谢你的帮助