Сравнить список компьютеров из текстового файла со свойством AD-User - PullRequest
0 голосов
/ 21 октября 2019

Я новичок в мире Powershell и пытаюсь написать скрипт, который выполняет следующее:

  • Получить список компьютеров из текстового файла
  • Получить список пользователей из текстового файла
  • Управляет добавлением имени компьютера в поле LogonWorkstations в каждой учетной записи пользователя.

Вот сценарий, который я написал на данный момент.

$Computers = Get-Content Computers.txt
$Users = Get-Content -Path Users.txt | Sort-Object -Unique
$ADUsers = Get-ADUser -Filter * -Properties LogonWorkstations -SearchScope Subtree -SearchBase "OU=ck,OU=users-com,DC=domain,DC=com" |
Where-Object {$Users -contains $_.Name} | Format-List Name,LogonWorkstations

КакСкрипт показывает, что я читаю и получаю свойство для Пользователей и имею список компьютеров в текстовом файле. Есть более 50 компьютеров и пользователей, и мой вопрос: как я могу сравнить этот пример проверки строки, если компьютер из строки 1 из Computers.txt существует в свойстве LogonWorkstations пользователя из строки 1 из Users.txt?

Ответы [ 2 ]

1 голос
/ 21 октября 2019

Если каждая строка обоих файлов соответствует, вы можете использовать простой цикл for, чтобы выполнить итерацию по обоим спискам одновременно. $ADUsers будет содержать вывод ADUser объектов, соответствующих условиям.

$ADUsers = for ($i = 0; $i -lt $Users.Count; $i++) {
    Get-ADUser -Filter "Name -eq '$($Users[$i])'" -Properties LogonWorkstations |
        Where-Object { ($_.LogonWorkstations -split ',') -contains $Computers[$i] }
}

Поскольку LogonWorkstations содержит строку, разделенную запятыми, вам придется выполнить некоторые манипуляции со строками. Использование оператора -split для символа , приведет к массиву строк. Оператор -contains прекрасно работает при сравнении элемента или коллекции элементов с одним элементом.


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

$ADUsers = foreach ($User in $Users) {
    Get-ADUser -Filter "Name -eq '$User'" -Properties LogonWorkstations | Where-Object {
        Compare-Object -Ref ($_.LogonWorkstations -split ',') -Dif $Computers -IncludeEqual -ExcludeDifferent
    }
}

Compare-Object здесь будет возвращать значение только при наличии точного совпадения.


Примечание: Iсчитаю, что атрибут LogonWorkstations был заменен атрибутом UserWorkstations. Оба могут работать сейчас, но не могут быть гарантированы в будущем.

0 голосов
/ 21 октября 2019

Я не пробовал приведенный ниже код, но, надеюсь, вы сможете решить любые небольшие проблемы:

$computers = Get-Content -Path #PATHTOCOMPUTERS.TXT
$users = Get-Content -Path #PATHTOUSERS.TXT | Sort-Object -Unique

#Set a counter to zero
$counter = 0

foreach ($user in $users){

    try{

        #Get the current user from AD
        $adUser = Get-ADUser -Filter { Name -eq $user} -Properties LogonWorkStations -ErrorAction Stop

        #Uses the current index using $counter to get the correct computer from computers.txt and 
        #checks if the user has it setup as a LogonWorkStation
        if ($adUser.LogonWorkstations -eq $computers[$counter]){
            Write-Host "$user has $computer as a logon workstation"
        }else{
            Write-Host "$user doesn't have $computer as a logon workstation"
        }

    }catch{
        Write-Host "Failed to get the AD user"
    }

    #Increment the $counter
    $counter++
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...