Сценарий Powershell для запроса Active Directory

#powershell #active-directory

#powershell #active-directory

Вопрос:

Я пытаюсь запросить всех пользователей в нескольких подразделениях с одинаковым именем. Получите SamAccountName атрибут, а затем проверьте наличие файла в определенном расположении с таким именем.

Вот что у меня есть на данный момент:

 $ous = Get-ADOrganizationalUnit -Filter "Name -eq 'Admin-User-Accounts'" 
$ous | ForEach-Object {
    $AccountName = Get-ADUser -Filter * -SearchBase $_.DistinguishedName |
                   Select SamAccountName
    Test-Path "\domain.netSYSVOLdomain.netIA$AccountName.pdf"
}
  

Если файл не найден. Я хочу добавить пользователя в группу, однако вот в чем загвоздка. Учетную запись необходимо добавить в группу несоответствия для организации, к которой принадлежит учетная запись.

То есть учетная запись администратора, найденная в:

ПОДРАЗДЕЛЕНИЕ= Учетные записи администратора, ПОДРАЗДЕЛЕНИЕ= Администрирование, ПОДРАЗДЕЛЕНИЕ=ORG1, ПОДРАЗДЕЛЕНИЕ= ОРГАНИЗАЦИИ, DC= домен, DC= сеть

будет добавлен в группу с именем «ORG1 IA — несоответствующие пользователи», расположенную в:

ПОДРАЗДЕЛЕНИЕ= группы, ПОДРАЗДЕЛЕНИЕ=ORG1, ПОДРАЗДЕЛЕНИЕ= Обеспечение информации, ПОДРАЗДЕЛЕНИЕ= ОРГАНИЗАЦИИ, DC= домен, DC= сеть

Комментарии:

1. так в чем именно проблема?

2. Что ж, кажется, у меня недостаточно навыков, чтобы написать код, чтобы заставить это работать.

3. С предоставленной информацией невозможно распределить пользователей по группам. Вам нужен список, схема именования, сопоставление или какой-либо способ пометки, какие группы пользователям следует назначить, если в соответствующем подразделении нет только одной группы.

Ответ №1:

Ну, ваш пост немного сбивает с толку, и нет способа действительно проверить, потому что у меня ничего подобного не настроено.

Тем не менее, выполнение запросов для пользователей во всех подразделениях или на предприятии является обычным повседневным делом.

Однако имя подразделения, как и любое другое имя объекта AD, должно быть уникальным. Итак, запрашивать одно и то же имя подразделения невозможно в одном лесу / домене AD. Если вы имели в виду запрос к каждому подразделению одного и того же имени пользователя, тогда все в порядке.

Пошагово описывая, как вы объясняете свой вариант использования, который вы изложили.

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

Используя псевдокод, затем пытаясь отобразить это … и без реального способа определить, что вы подразумеваете под несколькими вещами в вашем сообщении / примере. Итак, ниже приведен примерный первый пример того, как я бы подошел к этому… опять же, это непроверенное решение, поэтому я оставляю это домашнее задание вам.

 # query all users in multiple OUs
(Get-ADOrganizationalUnit -Filter *).DistinguishedName |
ForEach{
    # Collect all members of the current OU
    $AccountNames = Get-ADUser -SearchBase $PSItem -Filter *

    # Process each member in the current OU collection
    ForEach($AccountName in $AccountNames)
    {
        "Processing $($AccountName.SamAccoutnName)`n"

        # Initialize properties needed for processing
        $UserOrg = $AccountName.DistinguishedName.split(",")[1]
        $MemberCheckOU = "OU=Admin-User-Accounts,OU=Administration,OU=ORG1,OU=$UserOrg,DC=domain,DC=net"
        $NonCompliantOU = "OU=Groups,OU=ORG1,OU=Information Assurance,OU=$UserOrg,DC=domain,DC=net"

        # Validate user file existence for the current user
        If(-Not (Test-Path -LiteralPath "\domain.netSYSVOLdomain.netIA$($AccountName.SamAccoutnName).pdf)"))
        {
            # if no file Process the user groupmebership modification
            "Processing $($AccountName.SamAccoutnName)"

            # Notify that the file was not found and processing is required
            Write-Warning -Message "$($($AccountName.SamAccoutnName).pdf) not found. Process group modify actions"       

            # If the current user is in the MemberCheckOU, add to the NonCompliantOU
            If(Get-ADPrincipalGroupMembership -Identity $($AccountName.SamAccoutnName) | Where-Object -Property DistinguishedName -Match $MemberCheckOU )
            { Add-ADGroupMember -Identity $NonCompliantOU -Members $($AccountName.SamAccoutnName) }
            Else
            {
                # Do something else
            }
        }
        Else
        { 
          # Notify that the file was found and no processing required
          Write-Host "$($AccountName.pdf) found. No further actions taken" -ForegroundColor Green }
    }
}
  

Ответ №2:

Кажется, что одна из переменных неверна, потому что PowerShell выдает мне следующее:

Get-ADPrincipalGroupMembership : не удается проверить аргумент для параметра ‘Identity’. Аргумент равен null или пустой. Укажите аргумент, который не является нулевым или пустым, а затем повторите попытку выполнения команды.

Хорошо, итак, вот что у меня есть на данный момент на основе вашего сообщения выше Postanote:

 # query all users in multiple OUs
(Get-ADOrganizationalUnit -Filter "Name -eq 'Admin-User-Accounts'") |
ForEach{
    # Collect all members of the current OU
    $AccountNames = Get-ADUser -SearchBase $PSItem -Filter *

    # Process each member in the current OU collection
    ForEach($AccountName in $AccountNames)
    {
        "Processing $($AccountName.SamAccoutnName)`n"

        # Initialize properties needed for processing
        $UserOrg = $AccountName.DistinguishedName.split(",")[1]
        $MemberCheckOU = "OU=Admin-User-Accounts,OU=Administration,OU=$UserOrg,OU=ORGS,DC=domain,DC=net"
        $NonCompliantOU = "OU=Groups,OU=$UserOrg,OU=Information Assurance,OU=ORGS,DC=domain,DC=net"

        # Validate user file existence for the current user
        If(-Not (Test-Path -LiteralPath "\domain.netSYSVOLdomain.netIA$($AccountName.SamAccoutnName).pdf)"))
        {
            # if no file Process the user groupmebership modification
            "Processing $($AccountName.SamAccoutnName)"

            # Notify that the file was not found and processing is required
            Write-Warning -Message "$($($AccountName.SamAccoutnName).pdf) not found. Process group modify actions"       

            # If the current user is in the MemberCheckOU, add to the NonCompliantOU
            If(Get-ADPrincipalGroupMembership -Identity $($AccountName.SamAccoutnName) | Where-Object -Property DistinguishedName -Match $MemberCheckOU )
            { Add-ADGroupMember -Identity "$UserOrg IA - Non-Compliant Users" -Members $($AccountName.SamAccoutnName) }
            Else
            {
                # Do something else
            }
        }
        Else
        { 
          # Notify that the file was found and no processing required
          Write-Host "$($AccountName.pdf) found. No further actions taken" -ForegroundColor Green }
    }
}
  

Комментарии:

1. @postanote Я попробовал ваш скрипт и внес изменения, относящиеся к моей настройке, и powershell выдает следующее Get-ADPrincipalGroupMembership : Не удается проверить аргумент для параметра ‘Identity’. Аргумент равен null или пустой. Укажите аргумент, который не является нулевым или пустым, а затем повторите попытку выполнения команды. Сценарий приведен выше.

Ответ №3:

Смотрим на исходный фрагмент сценария:

 $ous = Get-ADOrganizationalUnit -Filter "Name -eq 'Admin-User-Accounts'" 
$ous | ForEach-Object {
    $AccountName = Get-ADUser -Filter * -SearchBase $_.DistinguishedName |
                   Select SamAccountName   # note 1
    Test-Path "\domain.netSYSVOLdomain.netIA$AccountName.pdf"   # note 2
}
  

Примечание 1: в конечном итоге вы получите $accountname.accountname, содержащий ваше значение. Я думаю, вы захотите расширить это вместо этого.
Примечание 2: Powershell, возможно, запутался и думает, что вы ищете переменную $accountname.pdf

Вместо этого попробуйте следующее…

 $ous = Get-ADOrganizationalUnit -Filter "Name -eq 'Admin-User-Accounts'" 
$ous | ForEach-Object {
    $AccountName = $(Get-ADUser -Filter * -SearchBase $_.DistinguishedName).SamAccountName 
    Test-Path "\domain.netSYSVOLdomain.netIA$($AccountName).pdf"   
}
  

здесь мы сохраняем значение just .sAMAccountName для запроса к $AccountName, и добавлением $ ($accountname) мы проясняем нужную нам переменную, и что .pdf не является частью имени переменной.

Теперь также обратите внимание, что при этом результаты нигде не сохраняются, они просто выводятся на экран.

Комментарии:

1. Здравствуйте, итак, я попробовал вашу версию этого скрипта. Однако при выполнении ‘write-host $($AccountName)’ я заметил, что переменная выдает имена пользователей в одной строке, если они находятся в одном подразделении. Мне нужно, чтобы каждое имя пользователя было в отдельных строках без пробелов, иначе при тестировании пути он не вернет правильные данные должным образом.