Скрипт Powershell для получения членства в ПК из одного подразделения - PullRequest
0 голосов
/ 18 июня 2019

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

В моей организации ПК может быть членом локального подразделения, к которому я принадлежу, или корпоративного подразделения, на которое у меня нет прав. Сканирование моих локальных групп OU не дало бы мне все результаты, которые я ищу. Мне удалось найти ответ, чтобы применить эту логику к членству пользователей и групп, но, похоже, она не работает для ПК.

Import-Module ActiveDirectory
$OU = "OU=Computers,OU={ORG UNIT}"
$Path = "C:\{FILE LOC}\AD-groupPClist_$(get-date -f yyyyMMdd_HHmm).csv"

$PC = ForEach ($P in (Get-ADComputer -Filter * -SearchBase $OU))
{
$Machine = Get-ADComputer $P -Properties MemberOf
$Groups = ForEach ($Group in ($Machine.MemberOf))
{
    (Get-ADGroup $Group).Name
}
$Groups = $Groups | Sort
ForEach ($Group in $Groups)
{
    New-Object PSObject -Property @{
    Group = $Group
    PCName= $Machine.Name
    }
}
}
$PC | Export-CSV $Path -NoTypeInformation

Когда я пытаюсь добавить столбец DNSHostName (например), он отображается как первый столбец в результатах, даже если он указан третьим. В этом случае, если бы я добавил DNSHostName, я бы хотел, чтобы выходным файлом были Имя группы, PCName, DNSHostName (или какой-либо другой атрибут); но в таком порядке.

1 Ответ

1 голос
/ 18 июня 2019

Я внес некоторые изменения, но это должно сработать.

Import-Module ActiveDirectory
$OU = "OU=Computers,OU={ORG UNIT}"
$Path = "C:\{FILE LOC}\AD-groupPClist_$(get-date -f yyyyMMdd_HHmm).csv"

$PC = ForEach ($P in (Get-ADComputer -Filter * -SearchBase $OU -Properties MemberOf)) {
    Foreach ($Group in $P.MemberOf) {
        [PSCustomObject]@{
            Group = (Get-ADGroup $Group).Name
            PCName = $P.Name
            DNSHostName = $P.DNSHostName
        }
    }
}
$PC | Sort-Object Group | Export-Csv $Path -NoTypeInformation

Что касается порядка свойств или заголовков CSV, @{} указывает PowerShell, что вы используете хеш-таблицу.Поведение хеш-таблицы по умолчанию должно быть неупорядоченным.Чтобы обойти это поведение, вам нужно создать свою хеш-таблицу с атрибутом [ordered] или просто использовать ускоритель типа [pscustomobject] при создании объекта.Одна только команда New-Object не защищена от неупорядоченной природы хеш-таблицы.Поскольку [PSCustomObject] быстрее и не имеет проблемы с упорядочением, лучше всего использовать это в пользу New-Object для пользовательских объектов.

Ниже приведен пример поведения New-Object сХеш-таблица:

# Unordered output example

New-Object -TypeName psobject -Property `
     @{
       property3 = 'value3'
       property2 = 'value2'
       property1 = 'value1'
     }

property1 property2 property3
--------- --------- ---------
value1    value2    value3

# Example enforcing order

New-Object -TypeName psobject -Property `
     ([ordered]@{
       property3 = 'value3'
       property2 = 'value2'
       property1 = 'value1'
     })

property3 property2 property1
--------- --------- ---------
value3    value2    value1

См. О хеш-таблицах для получения дополнительной информации о хеш-таблицах.

...