Створити журнал помилок з Powershell


0

Я створив сценарій, щоб допомогти в масовому редагуванні дозволів всередині великої структури папок, спираючись на список у файлі CSV. Сценарій працює як очікувалося, але для декількох папок я знаю, що сценарій повинен вийти з ладу і виправити помилку, оскільки папки не існує. Однак я не отримую вихід із сценарію, окрім запущеного списку, мені потрібно повідомити про поточну папку. Я намагався Try-Catch, але сценарій припиняє обробку при першій помилці, і я не впевнений, як інженеру Catch тримати сценарій. Який найкращий спосіб зберегти обробку скриптів, але відомості про вихідні помилки, які я знаю, існують у файлі, щоб пізніше їх переглядати?

Наприклад, коли код працює, він повинен працювати на папках 1-3. Якщо папки 2 не існує, Powershell використовував для введення помилки з шляху, який він не міг знайти, і продовжуватиме далі. Я хотів би, щоб ця помилка у файлі проаналізувалася пізніше, оскільки деякі папки не відповідають структурі, зміненій цим сценарієм.

$CSV=Import-Csv "C:\ProjectList.csv"

ForEach ($Entry in $CSV)

{

$ProjectNumber = $Entry.Projects
$Project = "$ProjectMain\$ProjectNumber"

Write-Host $Project  #Writes out current project being processed

#sddl defines

$sddlProject = 'D:PAI(D;CI;DCLCSDWDWO;;;DU)(D;CI;DCLCSDWDWO;;;S-1-5-21-513)(A;OICI;FA;;;BA)(A;OICIIO;FA;;;CO)(A;OICI;FA;;;SY)(A;OICI;FA;;;DA)(A;OICI;0x1200a9;;;DU)(A;OICI;FA;;;S-1-5-21-512)(A;OICI;0x1200a9;;;S-1-5-21-513)'

$sddlRootFolders = 'D:PAI(D;;SDWDWO;;;DU)(D;;SDWDWO;;;S-1-5-21-513)(A;OICIIO;FA;;;CO)(A;OICI;FA;;;SY)(A;OICI;FA;;;DA)(A;OICI;0x1301bf;;;DU)(A;OICI;FA;;;BA)(A;OICI;FA;;;S-1-5-21-512)(A;OICI;0x1301bf;;;S-1-5-21-513)'

$sddlCommon = 'D:AI(A;ID;FA;;;BA)(A;OICIIOID;FA;;;CO)(A;OICIID;FA;;;SY)(A;OICIID;FA;;;DA)(A;OICIID;0x1301bf;;;DU)(A;OICIIOID;FA;;;BA)(A;OICIID;FA;;;S-1-5-21-512)(A;OICIID;0x1301bf;;;S-1-5-21-513)'

$sddlMGMT = 'D:PAI(A;OICI;0x1301bf;;;S-1-5-21-1501)(A;OICIIO;FA;;;CO)(A;OICI;FA;;;SY)(A;OICI;0x1301bf;;;S-1-5-21-12461)(A;OICI;0x1301bf;;;S-1-5-21-12462)(A;OICI;0x1301bf;;;S-1-5-21-12463)(A;OICI;0x1301bf;;;S-1-5-21-12464)(A;OICI;0x1301bf;;;S-1-5-21-12465)(A;OICI;0x1301bf;;;S-1-5-21-12466)(A;OICI;FA;;;DA)(A;OICI;0x1301bf;;;S-1-5-21-1486)(A;OICI;0x1301bf;;;S-1-5-21-1487)(A;OICI;FA;;;S-1-5-21-512)(A;OICI;FA;;;BA)'


$sddlFiles = 'D:AI(A;ID;FA;;;BA)(A;ID;FA;;;SY)(A;ID;FA;;;DA)(A;ID;0x1301bf;;;DU)(A;ID;FA;;;S-1-5-21-512)(A;ID;0x1301bf;;;S-1-5-21-513)'


#Apply ACL to main folder

$securityDescriptor = Get-Acl -Path $Project
$securityDescriptor.SetSecurityDescriptorSddlForm($sddlProject)
Set-Acl -Path $Project -AclObject $securityDescriptor 


#Apply ACL to the top tier folders

$ProjectSub = $Project + "\Folder1"
$securityDescriptor = Get-Acl -Path $ProjectSub
$securityDescriptor.SetSecurityDescriptorSddlForm($sddlRootFolders)
Set-Acl -Path $ProjectSub -AclObject $securityDescriptor

$ProjectSub = $Project + "\Folder2"
$securityDescriptor = Get-Acl -Path $ProjectSub
$securityDescriptor.SetSecurityDescriptorSddlForm($sddlRootFolders)
Set-Acl -Path $ProjectSub -AclObject $securityDescriptor

$ProjectSub = $Project + "\Folder3"
$securityDescriptor = Get-Acl -Path $ProjectSub
$securityDescriptor.SetSecurityDescriptorSddlForm($sddlRootFolders)
Set-Acl -Path $ProjectSub -AclObject $securityDescriptor

#Apply ACL to MGMT folders

$ProjectSub = $Project + "\Folder9"

$ProjectDiscSub = $ProjectSub + "\MGMT"
$securityDescriptor = Get-Acl -Path $ProjectDiscSub 
$securityDescriptor.SetSecurityDescriptorSddlForm($sddlMGMT)
Set-Acl -Path $ProjectDiscSub -AclObject $securityDescriptor

#Apply ACL to MGMT inside folders

$ProjectDiscSub = $Project + "\Folder1\MGMT"
$securityDescriptor = Get-Acl -Path $ProjectDiscSub
$sddlMGMTSub = 'D:PAI(D;;SDWDWO;;;S-1-5-21-12471)(D;;SDWDWO;;;S-1-5-21-1497)(A;OICIIO;FA;;;CO)(A;OICI;FA;;;SY)(A;OICI;0x1301bf;;;S-1-5-21-12471)(A;OICI;FA;;;DA)(A;OICI;0x1301bf;;;S-1-5-21-1497)(A;OICI;FA;;;S-1-5-21-512)(A;OICI;FA;;;BA)'
$securityDescriptor.SetSecurityDescriptorSddlForm($sddlMGMTSub)
Set-Acl -Path $ProjectDiscSub -AclObject $securityDescriptor

$ProjectDiscSub = $Project + "\Folder3\MGMT"
$securityDescriptor = Get-Acl -Path $ProjectDiscSub
$sddlMGMTSub = 'D:PAI(D;;SDWDWO;;;S-1-5-21-12469)(D;;SDWDWO;;;S-1-5-21-1501)(A;OICIIO;FA;;;CO)(A;OICI;FA;;;SY)(A;OICI;0x1301bf;;;S-1-5-21-12469)(A;OICI;FA;;;DA)(A;OICI;0x1301bf;;;S-1-5-21-1501)(A;OICI;FA;;;S-1-5-21-512)(A;OICI;FA;;;BA)'
$securityDescriptor.SetSecurityDescriptorSddlForm($sddlMGMTSub)
Set-Acl -Path $ProjectDiscSub -AclObject $securityDescriptor

}

Відповіді:


1

Існує кілька стратегій поводження з такими помилками.

Перший - додати -ErrorActionпараметр до команди, яка може вийти з ладу.

Друга - обернути команду в спробі / ловити:

$ProjectSub = $Project + "\Folder2"
$securityDescriptor = Get-Acl -Path $ProjectSub
$securityDescriptor.SetSecurityDescriptorSddlForm($sddlRootFolders)
try {
    Set-Acl -Path $ProjectSub -AclObject $securityDescriptor
} catch {
    "Poo"
}
"Do more"

Зауважте, що в обох випадках ви все одно отримуєте стандартні повідомлення про помилки, але це виконання триває. У першому випадку виконання переходить до наступного рядка. У спробі / лові виконується вилов (друкується "Пу"), а потім наступний рядок ("Більше"). Вам дійсно потрібен спробу / ловити, якщо ви хочете зробити щось лише у випадку відмови, наприклад, зберегти деякі деталі в інший файл для подальшої обробки.

У вашому випадку, якщо припустити, що список обробки не надто великий, ви можете створити власний об'єкт в улові для накопичення неіснуючих деталей файлів у змінній. Потім в кінці сценарію записуйте змінну у файл. Просто слідкуйте за тим, щоб змінна стала занадто великою. У мене були сценарії, в яких 10-тисячний результат використовує досить велику кількість пам'яті!


Мені це здається, але перелік обробки досить великий. Показаний сценарій різко скорочується для зручності читання, і коли я запустив його на одну структуру, він пробіг протягом 50 хвилин. мені потрібно просто скинути помилку і рухатися далі. -ErrorAction продовжується, але це не скидає помилку у файл для мене.
Мекрон

Ах, перервались і 5-хвилинний таймер дістав мене. Коли я робив "Try / Catch", я намагався зробити це більше, ніж просто командами. Я спробую це для кожної команди сама і додам її до файлу і побачу, чи отримає це те, що мені потрібно.
Мекрон

Я не можу проголосувати, оскільки ще не маю репутації, але хотів сказати спасибі, Джуліан. Команда Try / Catch pet працює. У мене невдача виводить шлях, тому файл помилки заповнює шлях невдалих проектів та / або папок, залежно від використовуваної змінної. Досить виконати те, що мені потрібно.
Мекрон

Ніяких проблем @Meckron, я думаю, ви повинні завтра прийняти це як правильну відповідь (я, мабуть, пам’ятаю, що вам доведеться почекати 24 години?) Це також дасть мені додаткові бали, завжди вітаю :)
Джуліан Найт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.