Как устранить ошибку в цикле, чтобы получить объект групповой политики из OU - PullRequest
0 голосов
/ 09 мая 2019

Я создал сценарий PS для поиска объектов групповой политики, связанных в подразделении и подразделениях. Что я делаю не так? Я получаю эту ошибку и запутался в сообщении:

Get-ADOrganizationalUnit: Невозможно связать параметр «Удостоверение». Не могу преобразовать значение "@ {DistinguishedName = OU = Windows 7, DC = домен, DC = com}" типа "Selected.Microsoft.ActiveDirectory.Management.ADOrganizationalUnit" введите "Microsoft.ActiveDirectory.Management.ADOrganization alUnit". По адресу F: \ Untitled4.ps1: 11 char: 39 + $ LinkedGPOs = Get-ADOrganizationalUnit <<<< $ OU | select-object -ExpandProperty LinkedGroupPolicyObjects + CategoryInfo: InvalidArgument: (:) [Get-ADOrganizationalUnit], ParameterBindingException + FullyQualifiedErrorId: CannotConvertArgumentNoMessage, Microsoft.ActiveDirectory.Management.Commands.GetADOrganizationalUnit </p>

get-module activedirectory,grouppolicy

$exportFilePath = "c:\temp\AllGPOsWin7-report date $(get-date -f dd-MM-yyyy).csv"
$OU = "ou=Windows 7,dc=domain,dc=com"

$AllSubOU = Get-ADOrganizationalUnit -SearchBase $OU -SearchScope Subtree -Filter * | 
     Select-Object DistinguishedName

foreach ($OU in $AllSubOU){
$OU
$LinkedGPOs = Get-ADOrganizationalUnit $OU | select-object -ExpandProperty LinkedGroupPolicyObjects

$LinkedGPOGUID = $LinkedGPOs | foreach-object{$_.substring(4,36)}

$GPOName = $LinkedGPOGUID | foreach-object{get-gpo -guid $_ | select-object displayname}

$OU,$ListGPO -join "," | Out-File -FilePath $exportFilePath -Append -Width 200

Ответы [ 2 ]

1 голос
/ 09 мая 2019

Обратите внимание, что $ListGPO не существует, и вам нужно расширить объекты групповой политики, если более одного связано.Более того, Get-ADOrganizationalUnit должен извлечь свойство LinkedGroupPolicyObjects, чтобы использовать его (используйте -Properties LinkedGroupPolicyObjects). Я изменил разделитель в -join с "," на "|"потому что отличительные имена имеют запятые внутри.Кроме того, -width 200 отключит объект групповой политики при достижении этого предела.Было бы лучше построить пользовательский объект и использовать Export-Csv, вероятно.

Найдите ниже предварительный сценарий.

get-module activedirectory,grouppolicy
$exportFilePath = "c:\temp\AllGPOsWin7-report date $(get-date -f dd-MM-yyyy).csv"
$myOU = "ou=Windows 7,dc=domain,dc=com"

$AllSubOU = (Get-ADOrganizationalUnit -SearchBase $OU -SearchScope Subtree -Filter *).DistinguishedName

foreach ($myOU in $AllSubOU){
    $myOU
    $LinkedGPOs = ( Get-ADOrganizationalUnit $myOU -properties LinkedGroupPolicyObjects).LinkedGroupPolicyObjects
    $LinkedGPOGUID = $LinkedGPOs | foreach-object{$_.substring(4,36)}
    $GPOName = ( $LinkedGPOGUID | foreach-object { (get-gpo -guid $_) | select-object -expandproperty displayname}) -join "|"
    $out = if ( $GPOname ) { $myOU,$GPOName -join "|"} else { $myOU } 
    $out | Out-File -FilePath $exportFilePath -Append -Width 200
}
1 голос
/ 09 мая 2019

Проблема связана с вашей командой

$AllSubOU = Get-ADOrganizationalUnit -SearchBase $OU -SearchScope Subtree -Filter * | 
 Select-Object DistinguishedName

, ее следует изменить на

$AllSubOU = Get-ADOrganizationalUnit -SearchBase $OU -SearchScope Subtree -Filter * | 
 Select-Object -ExpandProperty DistinguishedName

Поскольку вы не указали часть раскрытия, PowerShell возвращал ее внутри контейнера,Следовательно, подразделение в фигурных скобках {} в коде ошибки

ОБНОВЛЕНИЕ - Следуя комментариям к этому ответу, см. Ниже:

#create a new hashtable
$hashTable = [hashtable]::new{}

#define the root OU
$rootOU = "OU=computers,DC=domain,DC=local"

#get all the sub OU in the root OU
$allSubOU = Get-ADOrganizationalUnit -SearchBase $rootOU -SearchScope Subtree -Filter * | Select-Object -ExpandProperty DistinguishedName

#loop through the sub OUs
foreach ($subOU in $allSubOU){

    #get the linked GPO objects on the OU
    $linkedGPO = Get-ADOrganizationalUnit $subOU | Select-Object -ExpandProperty LinkedGroupPolicyObjects

    #if the OU has a GPO then run through them
    if ($linkedGPO){

        #adding name to hashtable for current OU
        $hashTable.Add($subOU, @())

        #running through each GPO in sub OU
        foreach($GPO in $linkedGPO){

            #getting GUID from GPO
            $GPOGuid = $GPO.SubString(4,36)

            #using GUID to get displayname of GPO
            $GPOName = Get-GPO -Guid $GPOGuid | Select-Object -ExpandProperty DisplayName

            #add the GPO to the hashttable for the current OU
            $hashTable.$subOU += $GPOName
        }
    }else{
        #ou has no GPOs
        $hashTable.Add($subOU, "No GPO")
    }
}

#enumerate through the hashtable
$hashTable.GetEnumerator() | 
    #add OU to OU column in csv
    Select-Object -Property @{N='OU';E={$_.Name}},
    #add GPO to GPO(s) column in CSV
    @{N='GPO(s)';E={$_.Value}   } | 
    #export to CSV
    Export-Csv -NoTypeInformation -Path PATH
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...