Дополнение по 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
Перевод: Илья Лушников