Рейтинг:0

Как найти всех членов группы безопасности Windows в PowerShell, назначить имена переменных и вывести в CSV?

флаг za

Я не являюсь системным администратором / PowerShell как таковым, но у меня возникли проблемы с тем, чтобы этот запрос Powershell работал.

Необходимо вернуть всех пользователей в определенную группу безопасности Windows и отформатировать их определенным образом (показано ниже), однако у меня возникают некоторые проблемы с определением того, почему мой фильтр для групп безопасности не работает, и мне интересно, есть ли что-то не так с тем, как я настройте фильтр.

#фрагмент
$searcher.filter = "(&(memberof=CN=My Windows Security Group,OU=SecurityGroups,OU=Messaging,OU=Enterprise,DC=****,DC=****)(objectCategory=*)) "
$результаты = $searcher.findall()

У меня есть точка останова, настроенная в PowerShell ISE, однако $results не содержит никаких значений во время отладки.

Я смоделировал это из существующего скрипта от коллеги, где похоже, что он запрашивает DL, и я вижу значения $results при отладке этого:

#--------------------------------------------- --------
Пример фильтра #DL (работает)
#--------------------------------------------- --------
$Searcher.Filter = "(&(memberOf=CN=DL_TestApp_Admin,OU=Списки рассылки,OU=Обмен сообщениями,OU=Enterprise,DC=dcInfo,DC=dcInfo,DC=****)(objectCategory=*))"
$результаты = $searcher.findall()

Вот весь скрипт PS (модифицированный мной), который фильтрует группы безопасности Windows

$curdate = (Get-Date).ToString("MMddyyyy")

$baseDN = "LDAP://"
$Searcher = New-Object DirectoryServices.DirectorySearcher
$searcher.searchroot = новый объект system.directoryservices.directoryentry($basedn)
#--------------------------------------------- --------
#Групповой фильтр безопасности Windows (не работает)
#--------------------------------------------- --------
$searcher.filter = "(&(memberof=CN=My Windows Security Group,OU=SecurityGroups,OU=Messaging,OU=Enterprise,DC=****,DC=****)(objectCategory=*)) "
$результаты = $searcher.findall()

    #--------------------------------------------- --------
    #Построить набор данных в определенном формате
    #--------------------------------------------- --------
    $usercsv = $результаты | #-Объект {
         New-Object -TypeName PSObject -Property @{
            "Идентификатор пользователя" = $_.properties['samAccountName'][0]
            "Роль пользователя" = "Бла"
            "Повышенная роль" = "Y"
            "Внутренний пользователь" = "Д"
            "Дата последнего входа" = $null
            «Специфическая информация о приложении 1» = $ null
            «Специфическая информация о приложении 2» = $ null
            «Дата создания учетной записи» = $null
            "Дата последней смены пароля" = $null
            "Адрес электронной почты пользователя" = $_.properties['mail'][0]
            "Имя пользователя" = $null
            "Фамилия пользователя" = $null
            «Специфическая информация о приложении 3» = $ null
            "Группа обзора" = $null
        }
    }

#экспорт в csv
$usercsv | Select-Object -Property «Идентификатор пользователя», «Роль пользователя», «Роль с повышенными правами», «Внутренний пользователь», «Дата последнего входа в систему», «Информация о приложении 1», «Информация о приложении 2», «Дата создания учетной записи». ","Дата смены последнего пароля","Адрес электронной почты пользователя","Имя пользователя","Фамилия пользователя","Специфическая информация о приложении 3","Группа проверки" | Export-Csv -NoTypeInformation -Path "UsersListing_$curdate.csv"

Write-Host "Написал", $results.Count, "запись(и)"

#удаление последнего CR LF
#TODO: Переместите это в общую функцию в отдельном скрипте для всех     
скрипты для вызова
$stream = [IO.File]::OpenWrite("UsersListing_$curdate.csv")
$stream.SetLength($stream.Length - 2)
$поток.Закрыть()
$поток.Dispose()

Первоначально я написал это для запуска в конвейере выпуска DevOps Poweshell следующим образом для создания файла csv:

$Members = Get-ADGroup -Filter {Name -eq "WSG"} -Properties Member | 
Select-Object -ExpandProperty Member

$GlobalCatalog = "$((Get-ADDomainController -Discover).Name):xxxx"

$output = Foreach ($User в $Members)
{
  Get-ADUser -Identity $User -Server $GlobalCatalog -Properties CN,    
  EmailAddress, AccountExpirationDate, Created, HomePage, LastLogonDate, 
  PasswordLastSet при создании | CN выбора объекта, 
  SamAccountName, EmailAddress, AccountExpirationDate, Created, Enabled,     
  Домашняя страница, LastLogonDate, Name, PasswordLastSet, UserPrincipalName, 
  когда создан 
}

#выходной CSV-файл
$ вывод | Export-Csv $Env:TEMP\Users.csv -NoTypeInformation

В этом случае выходной формат не имел значения, и я не уверен, что могу изменить этот запрос, чтобы вывести результаты в этот формат:

            "Идентификатор пользователя" = $_.properties['samAccountName'][0]
            "Роль пользователя" = "Бла"
            "Повышенная роль" = "Y"
            "Внутренний пользователь" = "Д"
            "Дата последнего входа" = $null
            «Специфическая информация о приложении 1» = $ null
            «Специфическая информация о приложении 2» = $ null
            «Дата создания учетной записи» = $null
            "Дата последней смены пароля" = $null
            "Адрес электронной почты пользователя" = $_.properties['mail'][0]
            "Имя пользователя" = $null
            "Фамилия пользователя" = $null
            «Специфическая информация о приложении 3» = $ null
            "Группа обзора" = $null

И результаты этого запроса находятся в этом конкретном формате:

Китай: 
SamAccountName: 
Адрес электронной почты          : 
Дата действия учетной записи: 
Созданный               : 
Включено               : 
Домашняя страница : 
Дата последнего входа в систему: 
Имя                  : 
Последний пароль: 
UserPrincipalName : 
когда создано: 

Спасибо заранее за любую помощь.

Рейтинг:2
флаг ng

Нет необходимости беспокоиться о фактическом поиске LDAP, поскольку Модуль Active Directory PowerShell появился в Windows Server 2008 R2.

Get-ADGroupMember это то, что вы ищете. Если вам нужны дополнительные сведения о членах группы, вы можете использовать Get-ADUser на них, чтобы получить любую информацию, которая вам нужна.

Модуль AD PowerShell автоматически устанавливается на все контроллеры домена, но вы можете установить его в любой системе Windows Server, включив соответствующую функцию Windows:

Install-WindowsFeature RSAT-AD-PowerShell

Вы также можете установить его в клиентских системах Windows как часть Средства удаленного администрирования сервера.

Tikhon avatar
флаг za
Есть ли пример реализации, которому я могу следовать?
Semicolon avatar
флаг jo
@jazzBox Вы хотя бы посмотрели справочную страницу, на которую была ссылка?
Рейтинг:1
флаг za

Вот окончательный вариант Poweshell, который был разработан для достижения результатов, к которым мы стремились:

$curdate = (Get-Date).ToString("MMddyyyy")
#--------------------------------------------- ------------------------------
# Получить участников для групп безопасности Windows
#--------------------------------------------- ------------------------------
$Members = Get-ADGroup -Filter {Имя -eq "Моя группа объявлений"} -Properties Member | Select-Object -ExpandProperty Member

$GlobalCatalog = "$((Get-ADDomainController -Discover).Name):1234"
$результаты = @()

Foreach ($User в $Members)
{    
    $userInfo = Get-ADUser -Identity $User -Server $GlobalCatalog -Properties SamAccountName, EmailAddress, LastLogonDate
    $details = [заказано] @{
        
        «Идентификатор Active Directory» = $userInfo.SamAccountName
        «Роль пользователя» = «Моя группа объявлений»
        "Повышенная роль" = "N"
        "Внутренний пользователь" = "Д"
        «Дата последнего входа в систему» ​​= $userInfo.LastLogonDate
        «Специфическая информация о приложении 1» = $ null
        «Специфическая информация о приложении 2» = $ null
        "Дата создания аккаунта" = $null
        «Дата последнего изменения PWD» = $null
        "Адрес электронной почты пользователя" = $userInfo.EmailAddress
        "Имя пользователя" = $null
        "Фамилия пользователя" = $null
        «Специфическая информация о приложении 3» = $ null
        "Группа обзора" = $null

    }
    $results = New-Object PSObject -Property $details
}
#--------------------------------------------- --------
#вывод результатов в csv
#--------------------------------------------- --------
$ результаты | Export-Csv -NoTypeInformation -Path "UsersListing_$curdate.csv"

Имена переменных (идентификатор Active Directory, роль пользователя и т. д.) представляют собой заголовки столбцов в CSV-файле.

Надеюсь, это поможет кому-то.

Рейтинг:0
флаг cn

Вам необходимо указать базовое DN. Обычно это корневой DN домена.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.