Powershell: Как получить PowerShell, чтобы дать вам возможность выбрать подходящего пользователя при поиске по известному имени - PullRequest
0 голосов
/ 11 мая 2018

У меня есть сценарий 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()

1 Ответ

0 голосов
/ 11 мая 2018

Вы можете проверить количество пользователей, возвращаемых Get-ADUser, используя свойство Count.Это скажет вам, сколько объектов (пользователей) было возвращено.

Если существует более 1 пользователя, вы можете использовать Out-GridView, чтобы отобразить всплывающее диалоговое окно для выбора нужного результата из списка:

Out-GridView example

По умолчанию это разрешает множественный выбор, но добавление -OutputMode Single позволит только один выбор.

Ваш скриптможно обновить так:

$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
    }
}
...