0

我编写了一个脚本来从文件目录中提取权限,以便我们可以审核对文件夹的访问。我只是想看看我们有哪些组没有用户,所以我编写了这个脚本来提取所有组名并从值中删除域名,以便它可以通过第二个脚本运行它,为我们更正 AD​​ 组名如果它根本不正确,因为我们遇到了一个问题,由于某种原因,有些人回来时名称略有不同。问题是所有在权限中命名的 AD 用户都以错误的形式返回。我希望这些错误甚至不会出现在屏幕上,有没有办法做到这一点?如您所见,我一直在尝试几种不同的方法将它们通过管道传输到日志或 -ea 忽略选项,但它仍然在屏幕上显示错误。

$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

值得注意的是,这些错误并没有阻止我的脚本运行它更多的美学功能以及我自己的学习机会。我可以照原样使用我的脚本,但我想让它看起来更干净,并学习如何更好地处理错误。

4

2 回答 2

1

正如您表示您有兴趣了解有关错误处理的更多信息,我本周学到的一件事是这些用于错误处理和记录的常用参数:

-ErrorAction
-WarningAction
-ErrorVariable
-WarningVariable

您可以使用参数使错误消息静音,-ErrorAction SilentlyContinue但使用参数捕获错误-ErrorVariable

EXAMPLE: get-adgroup -ErrorAction SilentlyContinue -ErrorVariable MyErrors

您可以通过调用来读取和操作错误$MyErrors

警告的工作方式相同

它可能会给Try/Catch.

于 2021-01-15T16:38:05.880 回答
0

谢谢@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
于 2021-01-15T16:01:58.613 回答