0

Как облегчить жизнь с помощью Powershell (Часть первая)

Данная статья расскажет как Вам, дорогие друзья, облегчить свою жизнь используя Powershell, как автоматизировать задачи администрирования AD,Exhange,Sharepoint,VMware и множество других задач…

Сейчас я приведу вам несколько задач по администрированию Active Directory, которые можно автоматизировать с помощью Powershell и планировщика заданий.
1. Перенос Disabled пользователей в отдельную OU.
Для решения данной задачи нам понадобятся следующие cmdlet’ы:
Search-ADAccount,
Move-ADObject.
Первое что необходимо сделать это определиться где будет находиться OU для заблокированных пользователей пусть это будет OU=Disable, DC=test, DC=local
Следующее необходимо понять где находятся все пользователи, это может быть родная OU=users, а может быть и отдельная OU.
Рассмотрим вариант с отдельной OU и целым деревом под ним.
Начинаем написание текста скрипта

#Переменная, в которой содержаться пользователи.
$ActivePath = "OU=Employees,OU=Company,DC=test,DC=local"
#Переменная, в которую перенесутся заблокированные пользователи
$DisablePath = "OU=Disable, DC=test, DC=local"
Search-ADAccount -AccountDisabled -UsersOnly -SearchBase $ActivePath | move-ADObject -Target $DisablePath

2. При создании скриптов в AD большинство командлетов используют вид OU,DC,CN
Вам очень поможет следующая функция:

Function Convert-ADPath2DN([STRING]$Path)
{ $Res = ""
$ResOU = $null
#Преобразуем путь к OU в OU DN
$P = Join-Path $Path "/"
$P = $P.Replace("\","/")
#Проверяем, получилось ли у нас что-то похожее на путь
if ($P -match "^(?(\w+.\w+)+)\/.+$")
{
$i = 0
$DNS_DOMAIN_NAME = $Matches.DNS_DOMAIN_NAME
#Формируем путь по OU
While (-not ($P -eq $DNS_DOMAIN_NAME))
{
$i++
$OU = Split-Path -Leaf $P
$P = Split-Path -Parent $P
If ($i -ne 1)
{
$ResOU = $ResOU + ","
}
$ResOU = $ResOU+ "OU=$OU"
}
}
else
{
$DNS_DOMAIN_NAME = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain().Name
}
#Меняем точки на слэши, чтобы можно было использовать удобные функции для работы с путями
$DNS_DOMAIN_NAME = $DNS_DOMAIN_NAME.Replace(".","\")
$DC_NAMES = @()
While ($DNS_DOMAIN_NAME -ne "")
{
$DC = Split-Path -Leaf $DNS_DOMAIN_NAME
$DNS_DOMAIN_NAME = Split-Path -parent $DNS_DOMAIN_NAME
$DC_NAMES = $DC_NAMES + $DC
}
$Count = $DC_NAMES.Count
for ($i=$Count;$i -gt 0;$i--)
{
$DC = $DC_NAMES[$i - 1]
If ($i -ne $Count)
{
$ResDC = $ResDC + ","
}
$ResDC = $ResDC+ "DC=$DC"
if ($ResOU -ne $null)
{
$Res = $ResOU + "," + $ResDC
}
else
{
$Res = $ResDC
}
}

Return $Res
}

  1. Вообще Powershell умеет достаточно гибко управлять AD. Если выполнить скрипт приведенный ниже, то в c:\scripts\AD_OU_Tree.csv будет выведена все OU ниже OU=Employees
    Get-ADOrganizationalUnit -Filter * -SearchBase "OU=Employees,DC=test,DC=local" -searchscope Subtree| Select Name, DistinguishedName | export-csv "c:\scripts\AD_OU_Tree.csv" -Encoding UTF8 -NoTypeInformation

  2. Так же мы можем сделать список пользователей, которые были последний раз были авторизованы более 30 дней
    foreach ($usr in Get-ADUser -Filter *){
    if ($user | where {$_.LastLogonTime -le (Get-Date).AddDays(-30)}) {$usr.name | Out-File C:\Scripts\lastlogin.txt}
    }

На этом первую часть пожалуй и закончим.

Max Astafev