Войти

Показать полную графическую версию : Нужна помощь с формулировкой условия в PowerShell


lcnet
14-02-2022, 15:39
Приветствую!
Нужна помощь.

Делаю скрипт, который подключается к удаленным доменам и берет оттуда учетки из определенной OU-шки.
Затем проверяет на соответствие атрибутов, если локальные отличаются от удаленных, то устанавливаем атрибуты учетки из удаленной сети.
Если локальной учетки нет, то она создается с нужными атрибутами.

Я не могу придумать, как мне реализовать условие. по которому будет идти проверка на отсутствие учетки в удаленной сети (если человек уволен, его перемещают в другой контейнер) и удалять локальную учетку в случае отсутствия удаленной.

Все это нужно для формирования контактов в чанге, но это будет следующим шагом.

Сам скрипт:

[array]$var = Get-ADUser -SearchBase "OU=Accounts,DC=TEST,DC=LOC" -Properties * -Filter *
$comps = ''
#$date = (Get-Date).ToString('ddMMyyyy_HH')
$file = 'C:\_BAT\PS1\New_projects\Address_book\phrase' # пароль
$logfile = 'C:\_BAT\PS1\New_projects\Address_book\log\Error_log.txt' # файл логов
$User = 'ldap_user'
$password = ConvertTo-SecureString (Get-Content $file) -AsPlainText -Force

# хэш-тблица с именами региональных подразделений (имена добавляются спереди учетки
$subnets = @{
2='Ф.Санкт-Петербург2';3='Ф.Екатеринбург2';32='Ф.Калининград';34='Ф.Волгоград';35='Ф.Красноярск';36='Ф.Иркутск' ;40='Ф.Воронеж';49='Ф.Казань';50='Ф.Киров';55='Ф.Екатеринбург2';58='Ф.Астрахань';103='Ф.Хабаровск';
60='Ф.Белгород';62='Ф.Краснодар';63='Ф.Ижевск';75='Ф.Барнаул';76='Ф.Кемерово';84='Ф.Архангельск';87= 'Ф.Магнитогорск';91='Ф.Волгодонск';92='Ф.Липецк';94='Ф.Курск';95='Ф.Буденновск';89='Ф.Чебоксары';
83='Ф.Москва2';73='Ф.Москва';57='Ф.Москва3';99='Ф.Мурманск';44='Ф.Н.Новгород2';51='Ф.Н.Новгород';4=' Ф.Н.Новгород3';80='Ф.Новороссийск';59='Ф.Новосибирск2';93='Ф.Новосибирск';25='Ф.Уфа';64='Ф.Челябинск ';
74='Ф.Омск';69='Ф.Оренбург';52='Ф.Пенза';65='Ф.Пермь';66='Ф.Пятигорск';38='Ф.Ростов-на-Дону';39='Ф.Ростов-на-Дону2';26='Ф.Самара';100='Ф.Санкт-Петербург2';46='Ф.Саратов';42='Ф.Саратов2';
61='Ф.Смоленск';53='Ф.Сочи';47='Ф.Ставрополь';88='Ф.Сыктывкар';82='Ф.Тамбов';86='Ф.Тверь';77='Ф.Томс к';48='Ф.Тула';67='Ф.Тула2';45='Ф.Тюмень';104='Ф.Улан-Удэ';90='Ф.Ульяновск';54='Ф.Ярославль'
}

function data_request($val1, $val2, $val3, $val4){ # $val1 - адрес сервера; $val2 - OU-контейнера; $val3 - домен пользователя, $val4 - подстановка подсети
try {
$userName = $user + '@' + $val3
$domain = $val3.Split('.')
$cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $UserName, $Password
$usr = Get-ADUser -Server $val1 -SearchBase $val2 -Credential $cred -Properties * -Filter *
foreach ($u in $usr){
if ($u.EmailAddress -eq $null -or $u.OfficePhone -eq $null){
continue
}
#elseif ($u.enabled -eq $false){
# Remove-ADUser -Identity $($u.SamAccountName + $subnet[2])
#}
else
{
Write-Host $val1, $val3
$data = ($u.SamAccountName,
$u.DisplayName,
$u.Surname,
$u.GivenName,
$u.Office,
$u.OfficePhone,
$u.EmailAddress,
"___")

# Пишем данные региональных учеток в файл
Add-Content $("C:\_BAT\PS1\New_projects\Address_book\Shops\" + $domain[0] + '.txt') $data

# Если запрашиваемой учетки нет, переходим в блок CATCH где выполняется команда создания учетки
Get-ADUser -Identity $($u.SamAccountName + $val4[2]) -ErrorAction Stop
$Remote_User = $u.SamAccountName
$Local_User = Get-ADUser -Identity $($Remote_User + $val4[2])

# Проверяем атрибуты, если у удаленной учетки они отличаются от локальной, то меняем их
if ($Local_User){
if ($local_User.DisplayName -match $u.DisplayName){
Write-Host "OK"
}
else
{
Get-ADUser -Identity $($u.SamAccountName + $val4[2]) -Properties * | Set-ADUser -DisplayName $($subnets.[int]$val4[2] + " - " + $u.DisplayName)
}
if ($Local_User.title -eq $u.title){
Write-Host "OK"
}
else
{
Get-ADUser -Identity $($u.SamAccountName + $val4[2]) -Properties title | Set-ADUser -title $u.title
}
if ($Local_User.Department -eq $u.Department){
Write-Host "OK"
}
else
{
Get-ADUser -Identity $($u.SamAccountName + $val4[2]) -Properties Department | Set-ADUser -Department $u.Department
}
if ($Local_User.Company -eq $u.Company){
Write-Host "OK"
}
else
{
Get-ADUser -Identity $($u.SamAccountName + $val4[2]) -Properties Company | Set-ADUser -Company $u.Company
}
if ($Local_User.OfficePhone -eq $u.OfficePhone){
Write-Host "OK"
}else
{
Get-ADUser -Identity $($u.SamAccountName + $val4[2]) -Properties OfficePhone | Set-ADUser -OfficePhone $u.OfficePhone
}
if ($Local_User.Office -eq $u.Office){
Write-Host "OK"
}
else
{
Get-ADUser -Identity $($u.SamAccountName + $val4[2]) -Properties Office | Set-ADUser -Office $u.Office
}
if ($Local_User.Surname -eq $u.Surname){
Write-Host "OK"
}
else
{
Get-ADUser -Identity $($u.SamAccountName + $val4[2]) -Properties Surname | Set-ADUser -Surname $u.Surname
}
if ($Local_User.GivenName -eq $u.GivenName){
Write-Host "OK"
}
else
{
Get-ADUser -Identity $($u.SamAccountName + $val4[2]) -Properties GivenName | Set-ADUser -GivenName $u.GivenName
}
if ($Local_User.EmailAddress -eq $u.EmailAddress){
Write-Host "OK"
}
else
{
Get-ADUser -Identity $($u.SamAccountName + $val4[2]) -Properties EmailAddress | Set-ADUser -EmailAddress $u.EmailAddress
}

}

}
}
}
catch [Microsoft.ActiveDirectory.Management.ADServerDownException]{
Add-Content $logfile $((Get-Date).ToString('yyyy.MM.dd HH:mm:ss') + " -- Not answer -- " + $pc + " -- " + $dom + " -- " + $error[0] + " -- " + "Microsoft.ActiveDirectory.Management.ADServerDownException")
}
catch [System.Security.Authentication.AuthenticationException]{
Add-Content $logfile $((Get-Date).ToString('yyyy.MM.dd HH:mm:ss') + " -- Authentication -- " + $pc + " -- " + $dom + " -- " + $error[0] + " -- " + "System.Security.Authentication.AuthenticationException")
}
catch [Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException]{
if ($u.SamAccountName -eq $null){
continue
}
else
{
Write-Host "Попытка поздания пользователя"
New-ADUser -Name $($subnets.[int]$val4[2] + " - " + $u.DisplayName) -Enabled $true -SamAccountName $($u.SamAccountName + $val4[2]) -Surname $u.Surname -GivenName $u.GivenName -DisplayName $($subnets.[int]$val4[2] + " - " + $u.DisplayName) -AccountPassword $password -ChangePasswordAtLogon $true -Office $u.Office -OfficePhone $u.OfficePhone -EmailAddress $u.EmailAddress -Department $u.department -Company $u.Company -UserPrincipalName $($u.SamAccountName + $val4[2] + '@test.loc') -Title $u.title -path $('OU=' + $subnets.[int]$val4[2] + ',OU=Accounts,DC=TEST,DC=LOC')
}
}
catch {
Add-Content $logfile $((Get-Date).ToString('yyyy.MM.dd HH:mm:ss') + " -- General -- " + $pc + " -- " + $dom + " -- " + $error[0] + " -- " + "Block: CATCH")
}
}

$comps = @{
0=@('192.168.2.1','CN=Users,DC=spb3,DC=int');
1=@('192.168.3.1','CN=Users,DC=ekb3,DC=int');
2=@('192.168.4.1','CN=Users,DC=nnov2,DC=int');
3=@('192.168.25.1','CN=Users,DC=ufa,DC=int');
4=@('192.168.26.1','CN=Users,DC=samara,DC=int');
5=@('192.168.32.1','CN=Users,DC=klg,DC=int');
6=@('192.168.34.1','CN=Users,DC=volgograd,DC=int');
7=@('192.168.35.1','CN=Users,DC=kras,DC=int');
8=@('192.168.36.1','CN=Users,DC=irkut,DC=int');
9=@('192.168.38.1','CN=Users,DC=rostov,DC=int');
10=@('192.168.39.1','CN=Users,DC=rostov2,DC=int');
11=@('192.168.40.1','CN=Users,DC=vrn,DC=int');
12=@('192.168.42.1','CN=Users,DC=saratov,DC=int');
13=@('192.168.45.1','CN=Users,DC=tyumen,DC=int');
14=@('192.168.46.1','CN=Users,DC=saratov2,DC=int');
15=@('192.168.47.1','CN=Users,DC=stavropol,DC=int');
16=@('192.168.48.1','CN=Users,DC=tula2,DC=int');
17=@('192.168.49.1','CN=Users,DC=kazan,DC=int');
18=@('192.168.50.1','CN=Users,DC=kirov,DC=int');
19=@('192.168.51.1','CN=Users,DC=nnov,DC=int');
20=@('192.168.52.1','CN=Users,DC=penza,DC=int');
21=@('192.168.53.1','CN=Users,DC=sochi,DC=int');
22=@('192.168.54.1','CN=Users,DC=yaroslavl,DC=int');
23=@('192.168.55.1','CN=Users,DC=ekb,DC=int');
24=@('192.168.55.2','CN=Users,DC=ekb2,DC=int');
25=@('192.168.57.1','CN=Users,DC=msk3,DC=int');
26=@('192.168.58.1','CN=Users,DC=astrahan,DC=int');
27=@('192.168.59.1','CN=Users,DC=NOVOSIBIRSK2,DC=int');
28=@('192.168.60.1','CN=Users,DC=BELGOROD,DC=int');
29=@('192.168.61.1','CN=Users,DC=SMOLENSK,DC=int');
30=@('192.168.62.1','CN=Users,DC=krasnodar,DC=int');
31=@('192.168.63.1','CN=Users,DC=IZHEVSK,DC=int');
32=@('192.168.64.1','OU=Domain_SM_user,DC=CHELYABINSK,DC=int');
33=@('192.168.65.1','OU=user_RD,DC=PERM,DC=int');
34=@('192.168.66.1','CN=Users,DC=PYATIGORSK,DC=int');
35=@('192.168.67.1','CN=Users,DC=TULA,DC=int');
36=@('192.168.69.1','CN=Users,DC=orenburg,DC=int');
37=@('192.168.73.1','CN=Users,DC=msk2,DC=int');
38=@('192.168.74.1','CN=Users,DC=omsk,DC=int');
39=@('192.168.75.1','CN=Users,DC=barnaul,DC=int');
40=@('192.168.76.1','CN=Users,DC=kemerovo,DC=int');
41=@('192.168.77.1','CN=Users,DC=tomsk,DC=int');
42=@('192.168.80.1','CN=Users,DC=novorossiysk,DC=int');
43=@('192.168.82.1','CN=Users,DC=tambov,DC=int');
44=@('192.168.84.1','CN=Users,DC=arhangelsk,DC=int');
45=@('192.168.86.1','CN=Users,DC=tver,DC=int');
46=@('192.168.87.1','CN=Users,DC=magnit,DC=int');
47=@('192.168.88.1','CN=Users,DC=syktyvkar,DC=int');
48=@('192.168.89.1','CN=Users,DC=cheboks,DC=int');
49=@('192.168.90.1','CN=Users,DC=ulyanovsk,DC=int');
50=@('192.168.91.1','CN=Users,DC=volgodon,DC=int');
51=@('192.168.92.1','CN=Users,DC=lipetsk,DC=int');
52=@('192.168.93.1','CN=Users,DC=novosib2,DC=int');
53=@('192.168.94.1','CN=Users,DC=kursk,DC=int');
54=@('192.168.95.1','CN=Users,DC=budjonnovsk,DC=int');
55=@('192.168.99.1','CN=Users,DC=murmansk,DC=int');
56=@('192.168.100.1','CN=Users,DC=spb2,DC=int');
57=@('192.168.103.1','CN=Users,DC=habarovsk,DC=int');
58=@('192.168.104.1','CN=Users,DC=ulan-ude,DC=int')
}

for ($i=0; $i -lt $comps.Count; $i++){
$pc = $comps[$i][0] # IP сервера
$OU = $comps[$i][1] # OU-шка
$dm = $OU -Split',' | ConvertFrom-StringData # создаем хеш-таблицу из OU-шки
$dom = $dm.DC -join '.' # формируем из хеш-таблицы имя домена
$subnet = $pc.split('.') # Разбиваем IP-адрес на группы, позже понадобиться 3-й октет

Write-Host "+ + + + +"
Write-Host ""
Write-Host $pc
Write-Host $OU
Write-Host "_ _ _ _ _"
Write-Host ""

data_request -val1 $pc -val2 $OU -val3 $dom -val4 $subnet
}

lcnet
14-02-2022, 15:53
Но куда этот блок вставить, не могу понять...

lcnet
14-02-2022, 17:51
Или в первой функции этого не реализовать и надо писать еще одну функцию и выполнять обратное сравнение?

Elven
15-02-2022, 10:13
1. Если учетки запрашиваются из определенного OU, то какой смысл проверять отключены ли они, если уволенные переносятся в другой OU (или что подразумевается под контейнером)?
2. Другое дело если нужно именно проверить наличие учетной записи на то, существовала ли она вообще. Но тут включается как человеческий фактор, так и незначительная разница в регламентах и/или изменение оных (например если сначала учетные записи удаляли, а потом начали отключать и переносить в другой OU, или если какой-то сотрудник сделал это по незнанию).

Если же проигнорировать 2 и не пользоваться 1, то остаются варианты с
Search-ADAccount -AccountDisabled
или
Get-ADUser -filter 'enabled -eq "false"'

lcnet
16-02-2022, 12:54
Приветствую!
Я слишком запарился. видимо ))
Спасибо за идею!




© OSzone.net 2001-2012