2013-01-10 59 views
2

無法從某些PowerShell命令獲取我想要的輸出。我正在創建一個PowerShell腳本來幫助清理主目錄。我需要獲得目錄的權限,並確保directoy的名稱和有權訪問的用戶匹配。Powershell輸出

我使用Get-Acl函數,它有很多額外的數據。理論上這些目錄上的文件權限應該以管理員作爲所有者,用戶應該是Access下列出的唯一人員。

PS C:\> Get-Acl "\\fs1\home\e55555" 
Directory: \\fs1\home 
Path      Owner      Access 
----      -----      ------ 
e55555     BUILTIN\Administrators  DOM\e55555 Allow ... 

我想篩選出除訪問權限以外的所有內容。我嘗試了管道|選擇Access但它不會給我相同的輸出。

我知道除了UserID之外我還會得到額外的信息,所以我想我可以寫一個文件並嘗試「grep」我需要的東西。通過一些谷歌上搜索和實驗我得到了一些輸出,我覺得會很容易解析,這裏是命令和輸出:

PS C:\> $test = Get-Acl \\fs1\home\\e55555 | Select-Object -ExpandProperty Access 
| select IdentityReference 

IdentityReference 
----------------- 
DOM\e55555 
NT AUTHORITY\SYSTEM 
BUILTIN\Administrators 
NT AUTHORITY\Authenticated Users 

嘗試使用正則表達式來找到我想要的線,沒有我想的東西給我任何輸出。我想下面的命令不同的變化和也試圖解析,而不是一個變量文件:

echo $test | Select-String -pattern "^DOM" 
[regex]::matches($test,"^DOM") 

因此,如何將我的輸出調整了我的GET-acl命令?我怎麼能「grep」的任何行開始與DOM沒有額外的數據?

回答

2

這應該給你的所有用戶的訪問對象域

$path = "\\fs1\home\\e55555" 
(Get-Acl $path).Access | where { $_.IdentityReference -like "DOM*"} 

如果要檢查用戶在那裏,你可以使用:

$path = "\\fs1\home\\e55555" 
$username = $path | Split-Path -Leaf 

(Get-Acl $path).Access | where { $_.IdentityReference -like "DOM\$username"} 

我沒有」 t提取Identityreference屬性,因爲如果要檢查權限,則需要整個訪問對象。如果將Get-Acl輸出保存爲變量(例如$access = Get-Acl ......),則可以通過使用if($access) { do something }

來檢查用戶是否具有訪問規則。編輯:就像一個想法。如果你只是想在那裏與同名的文件夾中的用戶沒有訪問規則的文件夾(而不檢查用戶有什麼樣的權利),你可以嘗試:

$acls = Get-ChildItem "\\fs1\home\" | Get-Acl 
foreach ($acl in $acls) { 
    $users = $acl.Access | select -ExpandProperty IdentityReference 
    $username = $acl.PSChildName 
    if ($users -notcontains "DOM\$username") { $username } 
} 

這本來應該輸出(例如,用戶「e55555」無法訪問文件夾「e55555」)的文件夾名稱列表(例如「e55555」)。

+0

非常感謝您!能夠得到你需要的代碼。當我在PowerShell中看到你的代碼是面向對象的,而且我只需引用該屬性時,是一個很大的幫助。 – zjherner

0

我覺得你一直在思考。嘗試看到對象。並篩選 - 使用where,而不是select-string。例如:

$HomeDrive = '\\fs1\home\' 
$User = 'e55555' 

(Get-Acl $HomeDrive$User).Access | 
    where { $_.IdentityReference -match $user } 

這應該讓你開始......? :)

+0

(帶有數組輸出的命令)。只能使用PS 3.0功能 –

+0

對不起,但您在哪裏看到數組輸出? Get-Acl SingleFolder返回單個ACL對象。 :) – BartekB

+0

ofc。這是真的=)我的壞 –

0

嘗試將-Expand也添加到IdentityReference中。爲了鞏固自己在做什麼:

Get-Acl "\\fs1\home\\e55555" | Select-Object -ExpandProperty Access | 
    select -expand IdentityReference | ?{ $_.StartsWith("DOM") } 

,使其更簡單:

(Get-Acl "\\fs1\home\\e55555").Access | Select -Expand IdentityReference | ?{ $_.StartsWith("DOM") }