如何解决在 powershell 脚本中捕获错误
我编写了一个脚本来从文件目录中提取权限,以便我们可以审核对文件夹的访问。我只是想看看我们有哪些组而不是哪些用户,所以我写了这个脚本来提取所有组名并从值中删除域名,以便它可以通过第二个脚本运行它,为我们更正 AD 组名如果它根本不正确,因为我们遇到了一个问题,由于某种原因,有些人返回的名称略有不同。问题是所有在权限中命名的 AD 用户都作为错误返回。我希望这些错误甚至不显示在屏幕上有没有办法做到这一点?如您所见,我一直在尝试几种不同的方法将它们传送到日志或 -ea ignore 选项,但它仍然在屏幕上显示错误。
$filelocationscsv = "C:\AD\Excel\File Share migration.csv"
$filelocationcsvcontents = Get-Content -LiteralPath $filelocationscsv
$AllFolders = @()
foreach ($location in $filelocationcsvcontents) {
$AllFolders += $location.Substring(0,$location.Length-1)
}
$outputfilelocation = "C:\AD\Excel\permissions.csv"
$Results = @()
$errResults = @()
Foreach ($i in $Allfolders) {
if (Test-Path $i){
Write-Host "Obtaining file permissions for $i."
$acl = (Get-Acl $i -Filter *).Access | select -ExpandProperty IdentityReference
foreach($Access in $acl) {
if ($Access.Value -notlike "BUILTIN\Administrators" -and $Access.Value -notlike "domain\Domain Admins" -and $Access.Value -notlike "CREATOR OWNER" -and $access.Value -notlike "NT AUTHORITY\SYstem" -and $access.Value -notlike "Everyone" -and $access.Value -notlike "BUILTIN\Users" -and $access.Value -notlike "s-1*") {
[string]$perm = $Access.Value.Split('\')[1]
if($checkgroup = Get-ADGroup $perm){
#try
#{
## if( $LASTEXITCODE -gt 0 ){
## # Handle the error here
## # This example writes to the error stream and throws a terminating error
## $errResults += $LASTEXITCODE
## Write-Error "Unable to ping server,ping returned" -EA Ignore
## }
$Properties = [ordered]@{'AD Group'=$perm}
$Results += New-Object -TypeName PSObject -Property $Properties
#}
#Catch [Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException]
#{
# Write-Verbose "$perm skipped." -Verbose
# #$ErrorMessage =
# #$FailedItem = $_.Exception.ItemName
# #$errResults += $ErrorMessage + $FailedItem
#}
}
}
}
}
else {
Write-Host "$i is not accessible"
}
}
$Results | select -Property 'AD Group' -Unique | Export-Csv $outputfilelocation -NoTypeinformation
值得注意的是,这些错误并没有阻止我的脚本运行更多的美学功能以及我自己的学习机会。我可以照原样使用我的脚本,但我希望让它看起来更简洁,并学习如何更好地处理错误。
解决方法
和你一样 表示你有兴趣了解更多关于错误处理的知识,我这周学到的一件事是这些错误处理和记录的常用参数:
-ErrorAction
-WarningAction
-ErrorVariable
-WarningVariable
您可以使用参数 -ErrorAction SilentlyContinue
使错误消息静音,但使用参数 -ErrorVariable
捕获错误
EXAMPLE: get-adgroup -ErrorAction SilentlyContinue -ErrorVariable MyErrors
您可以通过调用 $MyErrors
警告的工作方式相同
它可能是 Try/Catch
的替代品。
谢谢@pwnosh,你真是个天才!
我将第 20 行改为
if($errResults += try {$checkgroup = Get-ADGroup $perm -ErrorAction Stop } catch {[Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException]}){
这一行也强制用户进入我的 CSV 文件,但第二个脚本仍然使用
$results = @()
foreach($Group in ($Groups = Import-csv C:\AD\Excel\permissions.csv)){
$groupname = $Group.'AD Group'
Write-Host "Confirming $groupname group name in AD."
$results += get-adgroup -Filter "name -like '$groupname'" -Properties * -SearchBase "dc=domain,dc=local,dc=net" | select name
}
$results | Export-Csv C:\AD\Excel\ADGroups.csv -NoTypeInformation
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。