2011-07-22 27 views
0

我想測試任意用戶是否具有對特定Active Directory對象的屬性的寫入訪問權限。我認爲,解決方案的一部分似乎是這樣的:檢查ActiveDirectory對象上的授權

NTAccount Account = new NTAccount("Domain\\XYZ"); 
SecurityIdentifier Sid = 
(SecurityIdentifier)Account.Translate(typeof(SecurityIdentifier)); 

這似乎讓我從用戶的字符串表示得到了具體體現。我想這是另一個難題:

string strMemberString = "LDAP://OU=Test,DC=Domain,DC=local"; 
DirectoryEntry computers = new DirectoryEntry(); 
computers.Path = strMemberString; 
computers.Options.SecurityMasks = SecurityMasks.Owner | SecurityMasks.Group 
| SecurityMasks.Dacl | SecurityMasks.Sacl; 

foreach (DirectoryEntry computer in computers.Children) 
{ 
    if (computer.Name == "CN=Test") 
    { 
     ActiveDirectorySecurity sdc = computer.ObjectSecurity; 
     //... 

不知道該從哪裏去。我如何完成這個?我應該追求完全不同的方式嗎?我正在使用.net 4.0。

我寧願解決方案完全是BCL代碼,而不是PInvoke或WMI。

+0

您是否意識到「對特定活動目錄對象的屬性具有寫權限」這一事實可能源自屬於某個組的組或屬於該組等等? – JPBlanc

+0

@JPBlanc:是的,我知道。這項「工作」應該由BCL爲我處理。我只需要了解使用情況。 –

+0

我編輯了我的答案,你會發現有辦法檢索用戶所在的安全組。 – JPBlanc

回答

0

我認爲最好的辦法是尋找一類給出了「有效權限」如在一個AD對象的安全選項卡中的高級對話框的選項卡表示:

enter image description here

它也存在一個名爲ACLDiag.exe的命令行工具,它可以執行您想要的任務。


(編輯) 要查找組的用戶屬於可以

  • 寫遞歸查詢程序,它提供了在大機構的糟糕表現。

  • 使用名爲「LDAP_MATCHING_RULE_IN_CHAIN」的特殊匹配規則(請參閱Search Filter Syntax for more information)。我在this other question舉例說明。這也有點長,但據我所知,這是檢索安全和分發組的唯一方法。

  • 使用'tokenGroups'屬性。它是一個計算屬性,它保存用戶所屬的每個SecurityGroup的ID,包括間接組。我覺得這一個你可以使用,並且具備UserPrincipal.GetAuthorizationGroups方法(在System.DirectoryServices.AccountManagement命名空間和.NET 3.5中引入)

+0

我正在尋找一個程序化的解決方案,而不是一個行政解決方案,但無論如何要感謝。 –

0

您需要檢查allowedAttributesEffective屬性。

+0

[Allowed-Attributes-Effective](http://msdn.microsoft.com/zh-cn/library/ms675218(v = VS.85).aspx)是可以在對象 – JPBlanc

+0

上修改的屬性列表,以及這是我OP的目標所在...... –

+0

我在想他正在尋找屬性上的ACL。 – JPBlanc