Имя пользователя:
Пароль:
 | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Нужна помощь с формулировкой условия в PowerShell

Ответить
Настройки темы
PowerShell - Нужна помощь с формулировкой условия в PowerShell

Новый участник


Сообщения: 33
Благодарности: 0

Профиль | Отправить PM | Цитировать


Приветствую!
Нужна помощь.

Делаю скрипт, который подключается к удаленным доменам и берет оттуда учетки из определенной 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
}

Отправлено: 15:39, 14-02-2022

 

Новый участник


Сообщения: 33
Благодарности: 0

Профиль | Отправить PM | Цитировать


Но куда этот блок вставить, не могу понять...

Последний раз редактировалось lcnet, 15-02-2022 в 09:01.


Отправлено: 15:53, 14-02-2022 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 33
Благодарности: 0

Профиль | Отправить PM | Цитировать


Или в первой функции этого не реализовать и надо писать еще одну функцию и выполнять обратное сравнение?

Отправлено: 17:51, 14-02-2022 | #3


Аватара для Elven

Ветеран


Сообщения: 992
Благодарности: 268

Профиль | Сайт | Отправить PM | Цитировать


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

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

Отправлено: 10:13, 15-02-2022 | #4


Новый участник


Сообщения: 33
Благодарности: 0

Профиль | Отправить PM | Цитировать


Приветствую!
Я слишком запарился. видимо ))
Спасибо за идею!

Отправлено: 12:54, 16-02-2022 | #5



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Нужна помощь с формулировкой условия в PowerShell

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Разное - Нужна помощь Vovan1396 Тест-форум 2 29-03-2014 18:17
VPN - Нужна помощь korenko Сетевые технологии 6 30-11-2013 09:53
Разное - Нужна помощь .... Format Тест-форум 1 12-11-2010 22:55
нужна помощь NiceSindy Хочу все знать 11 01-05-2004 10:16
нужна помощь Garry73 Хочу все знать 1 27-03-2004 16:04




 
Переход