Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Не пишется лог в PowerShell (http://forum.oszone.net/showthread.php?t=350637)

lcnet 07-02-2022 09:43 2979459

Не пишется лог в PowerShell
 
Привет!
Подскажите пожалуйста, почему не пишется лог?
Где я не прав?


Код:

[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\log_' + $date + '.txt' # файл логов
$User = 'ldap_user'
$password = ConvertTo-SecureString (Get-Content $file) -AsPlainText -Force
$logfile2 = 'C:\_BAT\PS1\New_projects\Address_book\log\unavaliable_' + $date + '.txt'
 
$subnets = @{
    3='Ф.Екатеринбург';
    32='Ф.Калининград';
    25='Ф.Уфа';
    26='Ф.Самара';
}
 
function data_request($val1, $val2, $val3){ # $val1 - адрес сервера; $val2 - OU-контейнера; $val3 - домен пользователя
    $userName = $user + '@' + $val3
    $domain = $val3.Split('.')
    $cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $UserName, $Password
    $usr = Get-ADUser -Server $val1 -Credential $cred -Properties * -Filter *
    foreach ($u in $usr){
        try{
            if ($u.EmailAddress -eq $null -or $u.OfficePhone -eq $null -or $u.enabled -eq $false){
                continue
            }
            else
            {
                $data = ($u.SamAccountName,
                    $u.DisplayName,
                    $u.Surname,
                    $u.GivenName,
                    $u.Office,
                    $u.OfficePhone,
                    $u.EmailAddress,
                    "__________")
                Add-Content $("C:\_BAT\PS1\New_projects\Address_book\SM\" + $domain[0] + '.txt') $data
            }
        }
 
        catch {
            Add-Content $logfile $dom
            Add-Content $logfile $u_rem.Name
            Add-Content $logfile $u_rem.SamAccountName
            Add-Content $logfile '+++'
            Add-Content $logfile $("ERROR: " + $error[0])
            Add-Content $logfile "__________"
        }
 
        if ($var | ? {$_.SamAccountName -notmatch $u.SamAccountName}){
            New-ADUser -Name $($subnets.[int]$subnet[2] + " - " + $u.DisplayName) -Enabled $true -SamAccountName $($u.SamAccountName + $subnet[2]) -Surname $u.Surname -GivenName $u.GivenName -DisplayName $($subnets.[int]$subnet[2] + " - " + $u.DisplayName) -AccountPassword $password2 -Path $(`"$container`") -ChangePasswordAtLogon $true -Office $u.Office -OfficePhone $u.OfficePhone -EmailAddress $u.EmailAddress -Department $u.department -Company $u.Company -UserPrincipalName $($u.SamAccountName + $subnet[2] + '@test.loc') -Title $u.title
        }
 
        catch {
            Write-Host $logfile2 $("Name - " + $subnets.[int]$subnet[2] + " - " + $u.DisplayName)
            Write-Host $logfile2 $("SamAccountName - " + $u.SamAccountName + $subnet[2])
            Write-Host $logfile2 "+++"
            Write-Host $logfile2 ("ERROR: " + $error[0])
        }
    }
}
 
$comps = @{
    0=@('192.168.32.1','CN=Users,DC=klg,DC=local');
    1=@('192.168.25.1','CN=Users,DC=ufa,DC=local');
    2=@('192.168.26.1','CN=Users,DC=samara,DC=local');
    3=@('192.168.3.1','CN=Users,DC=ekb,DC=local');
}
 
for ($i=0; $i -lt $comps.Count; $i++){
    $pc = $comps[$i][0]
    $OU = $comps[$i][1]
    $dm = $OU -Split',' | ConvertFrom-StringData
    $dom = $dm.DC -join '.'
    Write-Host $pc
    Write-Host $OU
 
    data_request -val1 $pc -val2 $OU -val3 $dom
}

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

Если надо, добавлю пояснения.

lcnet 07-02-2022 11:55 2979466

В процессе работы возникают ошибки, которые должны отлавливаться блоком CATCH, если я все правильно понимаю...

Ошибки:
1.
Get-ADUser : Не удается установить связь с сервером. Возможные причины: сервер не существует, выключен или на нем не запущены веб-службы Active Di
rectory.
C:\Users\p59_adm1\Desktop\Data request.ps1:22 знак:12
+ $usr = Get-ADUser -Server $val1 -Credential $cred -Properties * - ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ResourceUnavailable: (:) [Get-ADUser], ADServerDownException
+ FullyQualifiedErrorId : ActiveDirectoryServer:0,Microsoft.ActiveDirectory.Management.Commands.GetADUser

2.
Get-ADUser : Сбой аутентификации на удаленном сервере (поток может оставаться доступным для повторных попыток аутентификации).
C:\Users\p59_adm1\Desktop\Data request.ps1:22 знак:12
+ $usr = Get-ADUser -Server $val1 -Credential $cred -Properties * - ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : Ошибка безопасности: (:) [Get-ADUser], AuthenticationException
+ FullyQualifiedErrorId : ActiveDirectoryCmdlet:System.Security.Authentication.AuthenticationException,Microsoft.ActiveDirecto ry.Management.C
ommands.GetADUser

Но в файле логов ничего нет.
Пробовал явно указывать с блоке Catch ошибку, тоже ничего.
Т.е.

catch [System.Security.Authentication.AuthenticationException]{
code ...
}

Elven 07-02-2022 11:56 2979467

Цитата:

Цитата lcnet
Если надо, добавлю пояснения. »

Добавьте. Если с add-content все понятно, пусть и без ключей, но в файл вроде как должно писать (пошик умненький, сам разберется где имя файла, а где - то что в него нужно записать).
А вот с write-host во втором catch - нефига непонятно. Если это попытка писать в файл, то понятно почему не удачаная.
Ну и насчет же использования двух catch: насколько мне известно это используется, обычно, чтобы нормально разделить ошибки и, соответственно, их обработку, однако никаких условий в catch я не вижу, следовательно будет выполнен один из catch (какой - без идей, у меня без указания дополнительных условий пошик вообще отказался выполняться при двух catch). Судя по описываемой проблеме - выполняется только второй catch, а первый т.о. игнорируется.

lcnet 07-02-2022 13:23 2979472

Цитата:

Цитата Elven
Ну и насчет же использования двух catch »


После публикации поста я удалил тот код, но все равно не пишется лог.

Код:

[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\log_' + $date + '.txt' # файл логов
$User = 'ldap_user'
$password = ConvertTo-SecureString (Get-Content $file) -AsPlainText -Force
$logfile2 = 'C:\_BAT\PS1\New_projects\Address_book\log\unavaliable_' + $date + '.txt'

$subnets = @{
    3='Ф.Екатеринбург';
    32='Ф.Калининград';
    25='Ф.Уфа';
    26='Ф.Самара';
}

function data_request($val1, $val2, $val3){ # $val1 - адрес сервера; $val2 - OU-контейнера; $val3 - домен пользователя
    $userName = $user + '@' + $val3
    $domain = $val3.Split('.')
    $cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $UserName, $Password
    $usr = Get-ADUser -Server $val1 -Credential $cred -Properties * -Filter *
    foreach ($u in $usr){
        try{
            if ($u.EmailAddress -eq $null -or $u.OfficePhone -eq $null -or $u.enabled -eq $false){
                continue
            }
            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\SM\" + $domain[0] + '.txt') $data
            }
        }
        catch {
                Add-Content $logfile $dom
                Add-Content $logfile $u.Name
                Add-Content $logfile $u.SamAccountName
                Add-Content $logfile '+++'
                Add-Content $logfile $("ERROR: " + $error[0])
                Add-Content $logfile "__________"
        }
    }
}

$comps = @{
    0=@('192.168.32.1','CN=Users,DC=klg,DC=local');
    1=@('192.168.25.1','CN=Users,DC=ufa,DC=local');
    2=@('192.168.26.1','CN=Users,DC=samara,DC=local');
    3=@('192.168.3.1','CN=Users,DC=ekb,DC=local');
}

for ($i=0; $i -lt $comps.Count; $i++){
    $pc = $comps[$i][0]  # IP-address
    $OU = $comps[$i][1]  # OU
    $dm = $OU -Split',' | ConvertFrom-StringData
    $dom = $dm.DC -join '.'  #domain
    Write-Host $pc
    Write-Host $OU

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


Fors1k 08-02-2022 02:25 2979496

Цитата:

Цитата lcnet
Ошибки: »

Эти ошибки генерируются вне блока try.
Как тогда вы ожидаете увидеть их в логе?

lcnet 08-02-2022 10:54 2979520

Понял.
Как-то до меня не дошло очевидное...
Спасибо!

lcnet 08-02-2022 11:49 2979527

Дурацкий вопрос, но я не могу понять, какой тип ошибки указывать в CATCH...

Вот ошибка:
Get-ADUser : Не удается установить связь с сервером. Возможные причины: сервер не существует, выключен или на нем не запущены веб-слу
жбы Active Directory.
C:\Users\p59_adm1\Desktop\Data request.ps1:23 знак:16
+ ... $usr = Get-ADUser -Server $val1 -Credential $cred -Properties * ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ResourceUnavailable: (:) [Get-ADUser], ADServerDownException
+ FullyQualifiedErrorId : ActiveDirectoryServer:0,Microsoft.ActiveDirectory.Management.Commands.GetADUser

Если указываю ADServerDownException, ПС пишет, "Не удалось найти тип"
Если указываю Microsoft.ActiveDirectory.Management.Commands.GetADUser, ПС игнорирует и пишет в общий блок CATCH.

Fors1k 08-02-2022 15:52 2979564

Цитата:

Цитата lcnet
какой тип ошибки указывать в CATCH »

Код:

catch [Microsoft.ActiveDirectory.Management.ADServerDownException] {}

lcnet 08-02-2022 16:01 2979566

Fors1k, Спасибо!


Время: 13:11.

Время: 13:11.
© OSzone.net 2001-