Я новичок в PowerShell и Active Directory. Я взял из Интернета сценарий PowerShell, намереваясь получить всех пользователей AD типа «Пользователи» (в Организации) и все его группы AD, частью которых он является. Я перебираю пользователей AD во внешнем цикле со свойством «Имя» в качестве фильтра и его группой AD во вложенном цикле (код ниже).
Class CustomAdInfo
{
$UserName
$Group
$Email
}
$users_with_starting_letter = @('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z')
foreach ( $node in $users_with_starting_letter )
{
$filter = 'Name -like "' + $node + '*"'
$customObjects =
foreach($user in $filter)
{
$adUserObj = Get-ADUser -Filter $user -properties SamAccountName,memberOf,EmailAddress -ResultPageSize 256 -SearchBase "CN=Users,DC=ab,DC=cd"
$groups = $adUserObj.MemberOf | Get-ADgroup
foreach($group in $groups)
{
New-Object -TypeName CustomAdInfo -Property @{
UserName = $adUserObj.SamAccountName
Group = $group
Email = $adUserObj.EmailAddress
}
}
}
$customObjects | Select-Object -Property Username,group,Email | Export-Csv 'C:\Users\Members_and_Groups.csv' -Append
}
Результат (здесь показаны некоторые образцы), который я получил:
"System.Object[]","CN=group1,CN=Users,DC=ab,DC=cd","System.Object[]"
"System.Object[]","CN=group2,CN=Users,DC=ab,DC=cd","System.Object[]"
Ожидается SamAccountName и EmailAddress пользователя AD в столбцах 1 и 3 соответственно, но получено неизвестное значение «System.Object[]». Что мне не хватает?
Спасибо большое за ответ!!
Я предполагаю, что анализ @Santiago верен и имеет ссылку на соответствующий дубликат. Дайте нам знать, если синтаксис все-таки не является проблемой.
Другой вариант заключается в том, что $filter = 'Name -like "' + $node + '*"'
соответствует нескольким учетным записям пользователей, и в этом случае UserName = $adUserObj.SamAccountName
будет возвращать массив значений свойств (найдите «перечисление доступа к членам Powershell», чтобы узнать, как это работает), который сериализуется в строку System.Object[]
.
Спасибо за ответ @SantiagoSquarzon. В реальном сценарии PowerShell, который я выполняю, он находится в той же строке New-Object. Это я опечатку на форуме допустил, сейчас исправил.
Спасибо @mclayton. Я найду «перечисление доступа к членам Powershell» и попробую еще раз.
Проблема с вашим кодом связана с отсутствием цикла в $adUserObj
, вы фильтруете всех пользователей, начинающихся с буквы, т. е.: Name -like 'a*'
, такой фильтр наверняка вернет более одного пользователя.
Чтобы исправить это, а также сделать ваш код более читабельным, я бы предложил сначала создать фильтры, а затем опрашивать пользователей.
Class CustomAdInfo {
$UserName
$Group
$Email
}
[char[]] ([char] 'a'..[char] 'z') | ForEach-Object {
$getADUserSplat = @{
Filter = "Name -like '$_*'"
Properties = 'SamAccountName', 'memberOf', 'EmailAddress'
ResultPageSize = 256
SearchBase = 'CN=Users,DC=ab,DC=cd'
}
foreach ($user in Get-ADUser @getADUserSplat) {
foreach ($group in $user.MemberOf | Get-ADGroup) {
[CustomAdInfo]@{
UserName = $user.SamAccountName
Group = $group.Name # <= You need to choose an attribute here
Email = $user.EmailAddress
}
}
}
} | Export-Csv 'C:\Users\Members_and_Groups.csv'
@SandeepKumar попробуй обновление
@SandeepKumar задай новый вопрос, я тебе покажу. Это ответ на ваш первоначальный вопрос
Большое спасибо @Santiago Squarzon за ответ!! Ты мой спаситель!! Я тестировал приведенный выше скрипт PowerShell, диапазон, указанный выше [char] 'a'..[char] 'z'
, фактически возвращает значения ASCII диапазона. Поэтому я изменил диапазон на [char[]]([char]'y'..[char]'z')
, который принимал только значения символов.
На самом деле у нас есть выражения для нескольких свойств. Существующий код как $ad_users = Get-ADUser -Filter $Filter -Property EmployeeID,Manager,uht-IdentityManagement-AccountType -ResultPageSize 256 -SearchBase "CN=Users,DC=ab,DC=cd"
$ad_users | Select-Object -Property EmployeeID,@{Name = "Manager";Expression = {$_.Manager -replace '^CN=|,.*$'}},@{Name = "uht_IdentityManagement_AccountType";Expression = {$_."uht-IdentityManagement-AccountType"}}
Как использовать эти выражения в приведенном выше коде, т. е. при присвоении значений свойствам класса? Что-то вроде Manager=$user.Manager.replace_junk_characters
@SandeepKumar задайте новый вопрос. Это ответ на заданный вопрос
Конечно @Santiago Squarzon!!
У вас действительно есть
@{
в следующей строке или он находится в той же строке, что и-Property
? Если да, то это опечатка:@{
должен находиться в той же строке, что и операторNew-Object
. PowerShell не очень подходит для стиля кодирования Allman, поэтому я бы не советовал использовать его для этого языка.