Войти

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


lcnet
07-02-2022, 09:43
Привет!
Подскажите пожалуйста, почему не пишется лог?
Где я не прав?



[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
В процессе работы возникают ошибки, которые должны отлавливаться блоком 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
Если надо, добавлю пояснения. »

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

lcnet
07-02-2022, 13:23
Ну и насчет же использования двух 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
Ошибки: »
Эти ошибки генерируются вне блока try.
Как тогда вы ожидаете увидеть их в логе?

lcnet
08-02-2022, 10:54
Понял.
Как-то до меня не дошло очевидное...
Спасибо!

lcnet
08-02-2022, 11:49
Дурацкий вопрос, но я не могу понять, какой тип ошибки указывать в 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
какой тип ошибки указывать в CATCH »
catch [Microsoft.ActiveDirectory.Management.ADServerDownException] {}

lcnet
08-02-2022, 16:01
Fors1k, Спасибо!




© OSzone.net 2001-2012