PowerShell + Active Directory

Попробую описать способ получения объектов из AD в PoSH. Следует отметить что мои познания в скриптинге AD вообще не велики, многое узнал именно в PoSH в последние несколько дней. Так что не судите строго🙂 Если кому то интересна более серьезная работа с AD через PoSH, почитайте http://mow001.blogspot.com/ . Но там уровень несколько покруче, я понимаю далеко не всё🙂

Итак, задачка: Получить из AD список компьютеров, для дальнейшей работы с ними. И желательно не просто список а массив обьектов, с которыми можно удобно работать.

В результате изысканий родилась следующая функция (по сути это просто порт с vbs, и PoSH'евского тут мало…):

function Get-ADObject($category)
{
	$objSearcher = New-Object System.DirectoryServices.DirectorySearcher 
	#Получаем объект DirectorySearcher, который собственно и выполняет поиск в AD.

	$objSearcher.SearchRoot = New-Object System.DirectoryServices.DirectoryEntry 
	#Указываем контейнер в котором искать, в данном случае корень.

	$objSearcher.Filter = ("(objectCategory=$Category)") 
	#Фильтр для поиска

	[void]$objSearcher.PropertiesToLoad.Add("name") #Указываем что нам нужно получать только имя обьекта. 
	#Если в этот список вообще не добавлять ничего, то будут получены все свойства объектов, а нам это не нужно, 
	#так как мы всё равно заново будем получать объект в обёртку [adsi].

	$colResults = $objSearcher.FindAll() 
	#Собственно сам поиск
	
	$colResults|foreach{[adsi]($_.Properties.adspath[0])} 
	#на основе каждого возвращенного объекта, создаём [adsi] и выводим. 
	#Соответственно на выводе будет массив.
}

Эту функцию можно просто скопировать в буфер, и вставить в шелл. Если хочется чтоб она всегда была доступна, то можно либо вставить её в файл профиля $Profile, либо запихнуть в отдельный .ps1 файл, а уже его вызывать из профиля поставив перед вызовом точку (для выполнения в текущем окружении):

. .\GetAdObject.ps1

Ну и далее начинаем игратся🙂

Получаем список компьютеров:

PS D:\PowerShell> Get-ADObject computer

distinguishedName
-----------------
{CN=TOSHIBA4,OU=Laptops,OU=Computers,DC=MyDomain,DC=local}
{CN=TOSHIBA3,OU=Laptops,OU=Computers,DC=MyDomain,DC=local}
{CN=TESTXP2,OU=Desktops,OU=Computers,DC=MyDomain,DC=local}
...

Смотрим их количество…

PS D:\PowerShell> (Get-ADObject computer).count
70

Сохраняем результат запроса в переменную, чтоб секономить траффик🙂

PS D:\PowerShell> $pcs = Get-ADObject computer

Смотрим свойства обьектов в массиве…

PS D:\PowerShell> $pcs| Get-Member


   TypeName: System.DirectoryServices.DirectoryEntry

Name                       MemberType Definition
----                       ---------- ----------
accountExpires             Property   System.DirectoryServices.PropertyValueCollection accountExpires {get;set;}
badPasswordTime            Property   System.DirectoryServices.PropertyValueCollection badPasswordTime {get;set;}
badPwdCount                Property   System.DirectoryServices.PropertyValueCollection badPwdCount {get;set;}
...

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

PS D:\PowerShell> $pcs[0] | Format-List *


objectClass                : {top, person, organizationalPerson, user, computer}
cn                         : {TOSHIBA4}
distinguishedName          : {CN=TOSHIBA4,OU=Laptops,OU=Computers,DC=MyDomain,DC=local}
...

Стоит обратить внимание что все значения в фигурных скобках — из за структуры AD, — в них на самом деле массивы значений.

PS D:\PowerShell> $pcs[0].objectClass
top
person
organizationalPerson
user
computer

PS D:\PowerShell> $pcs[9].objectClass[4]
computer

Ну и делаем кое что полезное🙂

PS D:\PowerShell> $pcs | Format-Table name, operatingSystem* -AutoSize

name             operatingSystem           operatingSystemVersion operatingSystemServicePack
----             ---------------           ---------------------- --------------------------
{TOSHIBA4}       {Windows XP Professional} {5.1 (2600)}           {Service Pack 2}
{TOSHIBA3}       {Windows XP Professional} {5.1 (2600)}           {Service Pack 2}
{TESTXP2}        {Windows XP Professional} {5.1 (2600)}           {Service Pack 2}
...
Опубликовано в PowerShell. Комментарии к записи PowerShell + Active Directory отключены
%d такие блоггеры, как: