Как мне заставить мой скрипт использовать полные имена для поиска учетной записи AD? - PullRequest
0 голосов
/ 14 января 2020

Я очень новичок в powershell, все еще пытаюсь понять, как он работает. До сих пор я написал короткий скрипт для получения подробностей из CSV и разбивки свойств в AD. Если я использую имя пользователя, то есть smithj, оно работает нормально, но я не могу заставить его взять имя, подобное Джону Смиту, и найти учетную запись, с которой оно связано. То же самое относится и к полю менеджера, оно будет принимать имя пользователя, но я не могу заставить его принять полное имя.

Любая помощь или совет будет принята с благодарностью.

Import-module ActiveDirectory  
    $List = Import-CSV "\\SharedServer\shared\MYCSV.csv" | % { 
        $User = $_.UserName
        $ID = $_.EmployeeID 
        $EmployeeNumber = $_.EmployeeNumber
        $Description = $_.Description
        $Department = $_.Department
        $Title = $_.Title
        $AccountExpirationDate = $_.AccountExpire
        $Manager = $_.Manager

Set-ADUser $User -employeeID $ID -EmployeeNumber $EmployeeNumber -Description $Description -Department $Department -Title $Title -Manager $Manager -AccountExpirationDate $AccountExpirationDate 
}

Ответы [ 2 ]

0 голосов
/ 14 января 2020

В зависимости от того, что CSV содержит для UserName и Manager, лучше всего было бы иметь SamAccountName или DistinguishedName, поскольку эти атрибуты уникальны в пределах тот же домен. UserPrincipalName или EmailAddress также будет полезен для нацеливания на правильного пользователя.

Однако из вашего вопроса я понимаю, что у CSV есть пользователи Имя , которые должны соответствовать Name свойство пользователя AD.

В этом случае я согласен с IT Delinquent , что вы можете использовать это в параметре Filter для Get-ADUser, и это также то, что мой В приведенном ниже примере кода используется.

Тогда возникает вопрос о том, как вы ввели дату для AccountExpirationDate в CSV-файл ..
Этот параметр требует DateTime объект , не строка, поэтому вам придется преобразовать ее перед использованием.

Наконец, я бы предложил использовать Splatting для командлетов, таких как Set-ADUser, которые принимают много параметров.

Примерно так:

Import-CSV "\\SharedServer\shared\MYCSV.csv" | ForEach-Object { 
    $user = Get-ADUser -Filter "Name -eq '$($_.UserName)'" -ErrorAction SilentlyContinue
    if (!$user) {
        Write-Warning "User '$($_.UserName)' not found"
    }
    else {
        # convert the date string from the CSV into a real DateTime object
        # Since I cannot see the CSV, you may need to do this using [DateTime]::ParseExact()
        $expireDate = Get-Date $_.AccountExpire

        # create a Hashtable for the parameters
        $userProps = @{
            'EmployeeID'            = $_.EmployeeID
            'EmployeeNumber'        = $_.EmployeeNumber
            'Description'           = $_.Description
            'Department'            = $_.Department
            'Title'                 = $_.Title
            'AccountExpirationDate' = $expireDate
        }
        # get the manager object from the name
        $manager = Get-ADUser -Filter "Name -eq '$($_.Manager)'" -ErrorAction SilentlyContinue
        if ($manager) {
            $userProps['Manager'] = $manager.DistinguishedName
        }

        $user | Set-ADUser @userProps
    }
}

При использовании UserPrincipalName или EmailAddress измените фильтр на "UserPrincipalName -eq '$($_.UserName)'" или "EmailAddress -eq '$($_.UserName)'".
Возможно, вы даже захотите поэкспериментировать с разрешением неоднозначного имени ..

0 голосов
/ 14 января 2020

Я бы использовал Get-ADUser, а затем передал объект, который был возвращен в Set-ADUser. Вот быстрый пример:

Get-ADUser -Filter " Name -eq 'Name here' " | Set-ADUser -employeeID $ID 
...