2014-03-28 68 views
0

我在Windows 7中使用PowerShell我有下面的代碼片段,並想知道列表和它的子文件夾

爲什麼我沒有得到SID翻譯成一個友好的用戶名(在域)?

$OutFile = "I:\Permissions.csv" 
$RootPath = "K:\FolderName" 

$Folders = dir $RootPath -recurse | where {$_.psiscontainer -eq $true} 

foreach ($Folder in $Folders) 
{ 
    $ACLs = get-acl $Folder.fullname | ForEach-Object { $_.Access } 
    Foreach ($ACL in $ACLs) 
    { 

     $objSID = New-Object System.Security.Principal.SecurityIdentifier($ACL.IdentityReference.Value) 
     #$objUser = $objSID.Translate([System.Security.Principal.NTAccount]) 
     $objUser = $objSID.Translate([System.Security.Principal.SecurityIdentifier]) 
     $objUser.Value 


     #Show User 
     Write-Host 「`r`nThe user mapped to SID $($objSID) is $($objUser.value)`r`n」 -f 「Red」 

     $OutInfo = $Folder.Fullname + "," + $objUser.Value + "," + $ACL.AccessControlType + "," + $ACL.IsInherited + "," + $ACL.InheritanceFlags + "," + $ACL.PropagationFlags 
     Add-Content -Value $OutInfo -Path $OutFile 
    } 
} 

所需輸出將是SAM帳戶名稱。 (不顯示名稱)

John.Smith1 
John.Smith 
+0

請提供工作示例。從不聲明'$ ACL'。 –

+0

在這裏你去。你怎麼看? –

+0

更好,仍然缺少'$ Dname'和'$ outfile',但我創建了一個虛擬對象來過去。看到更新的答案。 –

回答

-2
$objSID = New-Object System.Security.Principal.SecurityIdentifier ` 
    ("S-1-5-21-768745588-123456789-987654321-500") 
$objUser = $objSID.Translate([System.Security.Principal.NTAccount]) 
$objUser.Value 

我認爲你缺少S-1-5-21-768745588-123456789-987654321-500 SID,但(我可能是錯的)檢查this link出更多的信息

+0

上帝沒有。這只是一個示例SID。他想要在ACL中轉換SID('$ ACL.IdentityReference')。 –

+0

請訪問http://blogs.technet.com/以獲取更多信息,還有更多來自實際Microsoft技術的示例 – SolutionSurfers

+0

我試過這個,我收到了異常。像<<異常調用「翻譯」與「1」參數:「信任關係下注 ween此工作站和主域失敗。>> –

1

IdentityReferenceSecurityIdentifier -object或NTAccount -object,而不是SID值作爲一個字符串,這就是你需要的構造函數SecurityIdentifier。如果您需要以字符串的形式訪問SID,則需要訪問$ACL.IdentityReference.Value

試試這個:

$RootPath = "K:\FolderName" 
#Define $OutFile 
#Define $Dname 

$Folders = dir $RootPath | where {$_.psiscontainer -eq $true} 

foreach ($Folder in $Folders) 
{ 
    $ACLs = get-acl $Folder.fullname 

    $ACLs.Access | ForEach-Object { 
     $ACL = $_ 

     #IdentityReference may already be a SID- or a NTAccount-object. 
     #Get SID-object 
     $objSID = $ACL.IdentityReference.Translate([System.Security.Principal.SecurityIdentifier]) 
     #Translate to NTAccount-object 
     $objUser = $objSID.Translate([System.Security.Principal.NTAccount]) 

     #Show User 
     Write-Host "`r`nThe user mapped to SID $($objSID) is $($objUser.value)`r`n" -f "Red" 

     $OutInfo = $Folder.Fullname + "," + $DName.Value + "," + $ACL.AccessControlType + "," + $ACL.IsInherited + "," + $ACL.InheritanceFlags + "," + $ACL.PropagationFlags 
     Add-Content -Value $OutInfo -Path $OutFile 
    } 
} 
+0

您是否建議我將其更改爲$ objSID = New-Object System .Security.Principal.SecurityIdentifier($ ACL.IdentityReference.Value) –

+0

是的,如果'$ ACL'包含這個屬性,你沒有向我們展示如何得到'$ ACL'對象 –

+0

剛剛嘗試過,沒有改變。我的objUser.Value不是AD中的友好名稱,在調試器中是空的。 –

1

您可以使用一個相當簡單的ADSI查找拉用戶的distinguishedName。嘗試了這一點:

$DName = ([adsi]"LDAP://<SID=$($ACL.IdentityReference.value)>").distinguishedName 

$ DNAME現在應該包含的東西,如一個字符串「CN = JSMITH,OU =用戶,DC =東西,DC = com公司

只得到來自用戶的名字你可以分割字符串幾次,因爲它是=,分隔:

$strUser = $dname.split("=")[1].split(",")[0] 
+0

如何獲取CN部分? –

相關問題