2016-03-06 43 views
0

在我們曾經有過鬆動的權限,幾年前我們公司的文件服務器。 含義,有用戶傾向於擁有完全許可的文件夾。這是一件壞事(用戶有權利打,鎖定系統(以及它的備份),只讓自己進入列出所有文件夾,其中用戶(管理員除外)都允許完全訪問

我的目標:

掃描的文件夾中的文件服務器的文件夾(文件未免太多)和輸出

  • 文件夾的完整路徑
  • 安全標識引用

,如果有人有除了域管理員或SY fullaccess幹。

輸出將被罰款爲:

Path, ACL 
E:\share\projectfolder, Domain\10JohnDoe 
E:\share\commonfolder, Domain\Everyone 
...

這是我有,但它是遠遠不夠的:

##define variable 
$path = "E:\Share" 
## begin script 

foreach ($file in Get-Childitem $path -Recurse -Directory) { 
    if (Get-Acl $file.FullName | 
     select -ExpandProperty Access | 
     where {$_.IdentityReference -notlike "AT\Domain Admins" -and 
      $_.IdentityReference -notlike "NT AUTHORITY\SYSTEM" -and 
      $_.AccessControlType -like "Allow" -and 
      $_.FileSystemRights -like "FullControl"} 
    ) { 
     Write-Host $file.FullName >> e:\check_acl.txt 
     Get-Acl $file.FullName | 
      select -ExpandProperty Access | 
      where {$_.IdentityReference -notlike "AT\Domain Admins" -and 
       $_.IdentityReference -notlike "NT AUTHORITY\SYSTEM" -and 
       $_.AccessControlType -like "Allow" -and 
       $_.FileSystemRights -like "FullControl" 
      } >> e:\check_acl.txt 
    } 
} 

但我想,我不能得到輸出(入文件!) 像那樣。

回答

1

Write-Host只顯示文本控制檯,它無法被保存。 Get-Acl >> check_acl.txt會寫出整個「對象」而不僅僅是身份引用。你想要的是用路徑和ACL(identityreference)屬性創建一個自定義對象,並將其導出到csv。

我也簡化了您的身份排除並將if-test更改爲foreach循環,因此您不必一次運行整個Get-ACL -line。

試試這個:

##define variable 
$path = "E:\Share" 
$ExcludeUsers = 'AT\Domain Admins','NT AUTHORITY\SYSTEM','AT\AT-IT','AT\01STREW','AT\01BRUND','AT\01KNAFP','AT\01BECKC' 
## begin script 

#Create regex-pattern to match all excluded users 
$ExcludeUsersRegex = ($ExcludeUsers | % { [regex]::Escape($_) }) -join '|' 


Get-Childitem $path -Recurse -Directory | ForEach-Object { 
    $file = $_ 

    Get-Acl -Path $file.FullName | 
    Select-Object -ExpandProperty Access | 
    Where-Object {$_.IdentityReference -notmatch $ExcludeUsersRegex -and $_.AccessControlType -eq "Allow" -and $_.FileSystemRights -eq "FullControl"} | 
    ForEach-Object { 
     #Foreach ACL 
     New-Object psobject -Property @{ 
      Path = $file.FullName 
      ACL = $_.IdentityReference 
     } 
    } 
} | Select-Object -Property Path, ACL | Export-Csv e:\check_acl.csv -NoTypeInformation 

輸出示例:

"Path","ACL" 
"C:\Users\frode\Desktop\TEST\YES","CONTOSO\frode" 
"C:\Users\frode\Desktop\TEST\YES","CONTOSO\FrodesOtherAccount" 
+0

你好弗羅德, 這似乎真的做......我感謝你! 當然沒有物體的真正理解和編程語言本身就很難... –

+0

沒問題。我建議閱讀一些教程來熟悉對象和管道,這在PowerShell中非常重要。我避免了大多數別名和快捷方式(除了創建正則表達式...'%'='Foreach-Object'),以便您可以在Technet上找到cmdlet並閱讀它們。瞭解您正在運行的代碼很重要。這就是我們學習的方式。 :-)祝你好運,歡迎來到StackOverflow。順便說一句。如果你認爲這是正確的答案,那麼mark使用答案左邊的複選標記,所以我們可以關閉這個問題。 –

+2

大多數的訪問權限使用繼承('IsInherited'屬性),所以這將是值得測試'$ path'目錄本身,以及除其子文件夾。下面是一些有用的鏈接,@DavidBrunner:理解流,重定向,以及寫主機在PowerShell中(https://blogs.technet.microsoft.com/heyscriptingguy/2014/03/30/understanding-streams-redirection-and -write宿主中-的powershell /)和[寫主機是有害的(http://www.jsnover.com/blog/2013/12/07/write-host-considered-harmful/) – JosefZ

相關問題