Freigeben über


Дополнение по Tab имен атрибутов LDAP внутри Расширенных фильтров

В своем предыдщем посте о Расширенных фильтрах я показал, как использовать переменные Powershell для представления значений внутри фильтров. Например:

PS D:\> $JohnSmith = Get-ADUser JohnSmith

PS D:\> Get-ADUser -Filter { manager -eq $JohnSmith.DistinguishedName }

## Получает все учетные записи пользователей, где менеджером указан JohnSmith

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

PS D:\> $SamAccountNameProperty = "SamAccountName"

PS D:\> Get-ADUser -Filter { $SamAccountNameProperty -eq "JohnSmith" }

## Получает объекты пользователей, где samAccountName = JohnSmith

Вы можете спросить: что такого интересного в этой возможности?

А теперь давайте представим, что у вас есть переменная PowerShell, которая содержит все имена атрибутов LDAP и имена свойств объектов AD PowerShell, представленные как свойства .NET, и вы бы хотели использовать эти переменные внутри фильтра. Когда в интерактивном режиме вы вводите строку фильтра в консоли Powershell, вы можете использовать дополнение по Tab для этих свойств. Это означает, что вам не требуется больше запоминать написание ваших любимых атрибутов LDAP!

Скажем, например, вы написали простой класс .NET:

public class ADObjectProp

{

public string ObjectGuid { get { return "objectGuid"; } }

public string Name { get { return "name"; } }

public string DistinguishedName { get { return "DistinguishedName"; } }

public string ObjectClass { get { return "ObjectClass"; } }

}

Теперь вы можете использовать переменные типа ADObjectProp внутри расширенного фильтра. Я называю такие переменные переменные запросов .

PS D:\> $queryADObject = new-object –type ADObjectProp

PS D:\> Get-ADObject -Filter { $queryADObject.Name -eq "JohnSmith" }

В показанном выше примере, если вы нажмете <TAB> после “$queryAODbject.”, PowerShell будет циклически перебирать все свойства. Можно также использовать неполное имя свойства и имена с универсальными символами («*», «?»), и PowerShell будет циклически перебирать подходящие свойства.

Это отличная возможность, особенно для тех, кому сложно запоминать все имена атрибутов LDAP и/или запоминать новые имена свойств, представленные в объектной модели AD Powershell. Теперь вопрос в том, как создать такой класс .NET, который бы содержал все имена атрибутов LDAP, представленные в вашей схеме? Для этого можно воспользоваться функцией Get - PossibleLdapAttributes , доступной в Active Directory Extensions и командлетом Add - Type , доступном в самом Powershell.

В Powershell можно динамически создавать собственные классы.NET с помощью командлета Add - Type. Вот команда Powershell, которая создает класс ADObjectProp (показанный выше):

PS D:\> Add-Type –Name ADObjectProp –NameSpace “Microsoft.ActiveDirectoryExtensions” –MemberDefinition ‘ public string ObjectGuid { get { return “objectGuid”; } } public string Name { get { return “name”; } } public string DistinguishedName { get { return “DistinguishedName”; } } public string ObjectClass { get { return “ObjectClass”; } }’ –PassThru

Инициализировать объект этого класса можно командой:

PS D:\> $xADObject = new-object –type Microsoft.ActiveDirectoryExtensions .ADObjectProp

Я изменил скрипт ActiveDirectoryExtensions для создания группы переменных запросов. Скрипт добавляет расширенные свойства для передаваемого типа объектов и получает список доступных атрибутов LDAP для соответствующего класса объектов, а также добавляет переменные запросов.

Получить список переменных запросов можно следующим образом:

PS C:\> import-module ActiveDirectory

PS C:\> C:\ActiveDirectoryExtension.ps1

PS D:\> dir variable:xad*

Name Value

---- -----

xADObject Microsoft.ActiveDirectoryExtensions.ADObjectProp

xADPrincipal Microsoft.ActiveDirectoryExtensions.ADPrincipalProp

..

Вот таблица, где показаны все переменные запросов, созданные скриптом ActiveDirectoryExtensions и краткое описание каждой из них:

$xADObject

Содержит все расширенные свойства ADObject и LDAP-атрибуты объекта top

$xADPrincipal

Содержит все расширенные свойства ADPrincipal и LDAP-атрибуты объекта top

$xADAccount

Содержит все расширенные свойства ADAccount и LDAP-атрибуты объекта top

$xADGroup

Содержит все расширенные свойства ADGroup и LDAP-атрибуты для объекта group

$xADUser

Содержит все расширенные свойства ADUser и LDAP-атрибуты для объекта user

$xADComputer

Содержит все расширенные свойства ADComputer и LDAP-атрибуты для объекта computer

$xADOrganizationalUnit

Содержит все расширенные свойства ADOrganizationalUnit и LDAP-атрибуты для объекта organizationalUnit

$xADFineGrainedPasswordPolicy

Содержит все расширенные свойства ADFineGrainedPasswordPolicy и LDAP-атрибуты для объекта msDS - PasswordSettings

$xADServiceAccount

Содержит все расширенные свойства ADServiceAccount и LDAP-атрибуты для msDS - ManagedServiceAccount

$xADDomainController

Содержит все расширенные свойства ADDomainController

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

Вот примеры того, как можно использовать переменные запросов в консоли Powershell:

Get-ADObject -Filter { $xADUser.SamAccountName -eq "Administrator" }

## Можно набрать $xADUser.Sam<TAB> для дополнения по tab до $xADUser.SamAccountName

## Или можно набрать $xADUser.*Account*<TAB> и циклически перебирать значения для поиска SamAccountName

Get-ADObject -Filter { $xADUser.displayName -like "*Policy*" }

Get-ADObject -Filter { $xADObject.Name -eq "Administrator" }

Небольшое предупреждение об использовании переменных запросов при дополнении по tab:

- Многие LDAP-атрибуты, определенные в схеме AD, содержат дефис (‘-’). Так как имена свойств .NET не могут содержать дефис, скрипт был изменен для конвертирования дефисов (‘-’) в символы подчеркивания (‘_’). Таким образом, для написания фильтра с использованием атрибута “msDS-LastKnownRDN”, можно указать $xADUser.msDS_LastKnownRDN.

Get-ADObject -filter { $xADObject.msDS_LastKnownRDN -like "*" } -IncludeDeletedObjects

Наслаждайтесь!

Swami

--

Swaminathan Pattabiraman

Developer – Active Directory Powershell Team

 

Присоединенный файл: ActiveDirectoryExtension.ps1.txt

Оригинал

Перевод: Илья Лушников