我正在用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中找到相應的用戶或組。
有沒有辦法做到這一點?如果您需要更多信息,請告訴我。
嗨Sky! 我正在研究如何實現類似的功能,並且我想知道2年後您的實現是否還活着?也許你發現更可靠的方法來匹配AD用戶/組與AclFileAttributeView的用戶/組? –
@VolodymyrKrupach是的,它工作可靠,已經在生產環境中使用了大約2年,現在沒有問題。看到它運作良好,我沒有得到任何進一步的投入,我沒有進一步研究這個主題,因此沒有找到任何其他方式來做到這一點。 – Sky
感謝您的信息! –