4

Java を使用してリモート サーバーにアクセスしています。サーバーは Microsoft Windows を実行し、Active Directory とファイル システム共有を提供します。JNDI を介して Active Directory からユーザーとグループを読み取りましたが、これはうまく機能しています。distinguishedNameなどのすべてのユーザー属性を取得しますobjectSid

私の 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オブジェクトは、Active Directory で対応するユーザーを見つけるために使用できる SID を返します。ただし、UserPrincipalがグループを表す場合はgetName()、たとえば のようなテキストを返すだけです"VORDEFINIERT\Administratoren"

このテキストを Active Directory で定義されたグループにマップする方法が見つかりませんでした。AD の対応するグループには、次のdistinguishedNameプロパティがありますCN=Administratoren,CN=Builtin,DC=mydomain,DC=com

Java プログラムが実行されるマシンとサーバーの両方で、ドイツ語版の Windows が実行されています。AD がCN=Builtin(英語) を返すのに、ファイル システムがグループ名をドイツ語に翻訳して返すのは奇妙ですVORDEFINIERT。たとえば、両方の場合、Builtinおそらく を解析して、AD オブジェクトの がどうあるべきUserPrincipalかを見つけることができdistinguishedNameます...ただし、このアプローチはあまり信頼できないようです。

UserPrincipalAD で対応するユーザーまたはグループを見つけることができるように、すべてのオブジェクトの SID を読み取れるようにしたいと考えています。

これを行う方法はありますか?さらに情報が必要な場合はお知らせください。

よろしく、空

4

1 に答える 1

3

この問題の調査を続け、解決策を見つけました。

この場合 (Windows 共有にアクセス) によって返されるオブジェクトは、aclEntry.principal()実際にはクラスWindowsUserPrincipals.GroupまたはWindowsUserPrincipals.User. UserPrincipalによって実装されるインターフェイスWindowsUserPrincipals.Userです。AndWindowsUserPrincipals.GroupのサブクラスですWindowsUserPrincipals.User

クラスsun.nio.fs.WindowsUserPrincipalsは公開されていないため、直接アクセスすることはできません。しかし、内部クラスWindowsUserPrincipals.Userには、探していた SID が正確に含まれていることがわかりました。というプライベートフィールドにありsidStringます。

したがって、私の解決策は、返さUserPrincipalれたものが aであるかどうかを確認WindowsUserPrincipalし、そうであれば、リフレクションを使用して field の値を読み取ることですsidString

それは機能し、信頼できる方法で書くことができますが、リフレクションを使用しなければならなかったため、本当に素晴らしい解決策ではありません。しかし、SID にアクセスしたり取得したりする簡単な方法は見つかりませんでした。

SID を読み取るためのより良い方法を知っている場合は、この質問に回答してください。ありがとうございました。

于 2013-10-22T16:42:27.637 に答える