2013-10-22 106 views
3

我正在用Java訪問遠程服務器。服務器運行Microsoft Windows並提供Active Directory以及文件系統共享。我通過JNDI從Active Directory讀取用戶和組,這非常棒。我獲得所有用戶屬性,如distinguishedName,objectSid等。將Java UserPrincipal映射到Active Directory用戶

我的Java程序還使用Java 7和NIO.2連接到同一臺服務器上的Windows共享。我可以讀取遠程文件系統並獲取有關它的信息。我也可以讀取文件權限設置是這樣的:

import java.nio.file.Files; 
    import java.nio.file.attribute.AclEntry; 
    import java.nio.file.attribute.AclFileAttributeView; 
    import java.nio.file.attribute.UserPrincipal; 

    [...] 

    AclFileAttributeView aclView = Files.getFileAttributeView(path, AclFileAttributeView.class); 

    for (AclEntry aclEntry : aclView.getAcl()) { 
     UserPrincipal principal = aclEntry.principal(); 
     [...] 
    } 

這樣,我得到一個UserPrincipal對象的訪問權限。這個類只提供了一個方法getName()它返回一些名稱或有時一個SID。

對於實際用戶,UserPrincipal對象返回一個SID,我可以使用該SID在Active Directory中查找相應的用戶。但是,如果UserPrincipal代表一個組,getName()只是返回一個文本,例如"VORDEFINIERT\Administratoren"。我找不到將此文本映射到Active Directory中定義的組的方式。 AD的相應組具有此distinguishedName財產:CN=Administratoren,CN=Builtin,DC=mydomain,DC=com

Java程序運行的機器和服務器運行的是德語版本的Windows。奇怪的是,AD返回CN=Builtin(英文),但文件系統返回一個組名稱,其中德文翻譯VORDEFINIERT。如果兩者都是例如Builtin我大概可以解析UserPrincipal並找出AD對象的distinguishedName應該是什麼......但是,這種方法似乎並不可靠。

我真的希望能夠讀取所有UserPrincipal對象的SID,以便我可以在AD中找到相應的用戶或組。

有沒有辦法做到這一點?如果您需要更多信息,請告訴我。

回答

2

我繼續研究這個問題,並找到解決方案

最好的問候, 天空:

在這種情況下(訪問Windows共享)由aclEntry.principal()返回的對象實際上WindowsUserPrincipals.Group類或WindowsUserPrincipals.User的。 UserPrincipal是由WindowsUserPrincipals.User實現的接口。 WindowsUserPrincipals.GroupWindowsUserPrincipals.User的一個子類。

sun.nio.fs.WindowsUserPrincipals不公開,所以無法直接訪問。但是我看到內部類WindowsUserPrincipals.User完全包含我一直在尋找的SID。它在一個名爲sidString的私人領域。

所以我的解決方案是檢查返回的UserPrincipal是否是WindowsUserPrincipal,如果是,則使用反射來讀取字段sidString的值。

它的工作原理可以用可靠的方式編寫,但它並不是一個非常好的解決方案,因爲我必須使用反射。但我沒有找到更簡單的方式來訪問或獲取SID。

如果您知道更好的方法來讀取SID,請仍然回答這個問題。謝謝。

+0

嗨Sky! 我正在研究如何實現類似的功能,並且我想知道2年後您的實現是否還活着?也許你發現更可靠的方法來匹配AD用戶/組與AclFileAttributeView的用戶/組? –

+1

@VolodymyrKrupach是的,它工作可靠,已經在生產環境中使用了大約2年,現在沒有問題。看到它運作良好,我沒有得到任何進一步的投入,我沒有進一步研究這個主題,因此沒有找到任何其他方式來做到這一點。 – Sky

+0

感謝您的信息! –

相關問題