18

Samba3 は、ユーザーには S-1-22-1 の範囲、グループには S-1-22-2 の範囲の SID を使用します。たとえば、S-1-22-1-1-10042 は uid 10042 を持つ UNIX ユーザーです。 Windows アカウントのこの機能と同様に、そのような SID を「myunixaccount」のような名前にマップできるようにしたいと考えています。マッピング:

SecurityIdentifier sid = ...; // For instance from FileSystemAccessRule.
name = sid.Translate(typeof(NTAccount)).Value;

Windows 自体はこのマッピングを行うことができますが、マッピング アルゴリズムを見つけることができないようです。

追加: 環境の説明

Convert SID to Username in C# で提案されたソリューションをテストしました。役に立ちませんでした。したがって、いくつかの追加の環境の説明:

  • W7 Professional、x86 を実行するドメインまたはスタンドアロンに参加している Windows PC。
  • Samba ベースのドライブにあるファイル。Samba はドメインの AD コントローラーに対して認証を行います。
  • Samba バージョン: 4.0.3、Linux 2.6.18-238、x64 で実行。
  • Samba 用の PAM、対話型セッションなど。
  • AD コントローラは W2012 であり、ディレクトリにデフォルトの UNIX 拡張属性がいくつかあり、UID などのマッピングを許可します。
  • .NET Framework ライブラリ 4.5.2。
  • ldap.conf:

piece of ldap.conf

nss_base_passwd=OU=nl,OU=xxx,dc=yyy,dc=local?sub(objectCategory=user)
nss_map_objectclass     posixAccount    User
nss_map_objectclass     shadowAccount   User
nss_map_attribute       uid             sAMAccountName
nss_map_attribute       uidNumber       uidNumber
nss_map_attribute       gidNumber       gidNumber
nss_map_attribute       cn              sAMAccountName
nss_map_attribute       uniqueMember    member
nss_map_attribute       userPassword    msSFUPassword
nss_map_attribute       homeDirectory   unixHomeDirectory
nss_map_attribute       loginShell      loginShell
nss_map_attribute       gecos           cn
nss_map_objectclass     posixGroup      Group
nss_map_attribute       shadowLastChange        pwdLastSet

Windows 認証を使用した UNIX での対話型ログオンは正常に機能します。Samba 共有の dito。ドメインで PC を使用する場合、資格情報は要求されません。

一部のサンプルでは、​​ユーザー gle3 (1 で強調表示) もドメインに存在しますが、SID が異なります。ここで使用される SID は、S-1-22-1-1-10001 などの Samba SID です。

(2) では、使用されている passwd 構成にユーザーが存在することがわかります。もちろん、次の結果は得られません: grep gle3 /etc/passwd、エントリはリモート サーバーから使用されるためです。リモート サーバーは、gle3 のユーザー SID を UNIX uid 10001 およびデフォルト グループ 10003 にマップします。

(3) では、既定のグループが存在しないことがわかります。これが、アクセス許可がそれを名前に解決できない理由です。

明らかに、Windows は何らかの方法でファイル サーバーに「これらの SID のデータを提供してください」と尋ね、Samba ファイル サーバーは何らかの方法で応答します。その最後のものの名前。

Windows エクスプローラー (オランダ語) UNIX getent パスワード UNIX getent グループ

4

1 に答える 1

1

私は、2000 以上のコンピュータ ネットワーク上にローカル LAN クローラを構築するために、これをいじっていました。あなたが求めているのは SMB プロトコルの一部ではないと確信しています。Windows が資格情報を解決できない場合、セキュリティ プロパティに SID が表示されます。

基本的に何が起こるかというと、SID は一意の ID にマップされたオブジェクト ID (ユーザー名/グループなど) です。それらは GUID のように機能します。通常、PC はユーザー名ではなく SID で通信します。

ここで、考慮する必要があるさまざまな種類の SID があります。

  1. 標準的な方法を使用して解決できる Active Directory SID があります。これらには、グループおよびユーザーの SID が含まれることに注意してください。
  2. 標準的な方法を使用して解決できるローカル PC SID があります。繰り返しますが、グループとユーザーの SID です。これはおそらく Windows だけでなく Samba でも機能しますが、これまで Windows でしかテストしていませんでした。
  3. リモート PC には、通常は解決できない SID があります。基本的にこれは、NTLM トークンを別の方法で取得した場合に起こることです。

実際にはこれ以外にもたくさんあります...証明書の資格情報、予約済みのユーザーなどはすべて、ログインに使用できるオブジェクト ID でもありますが、簡単に説明します。このコメントから得られる重要な点は、すべてのユーザー名には SID がありますが、すべての SID にもユーザー名があるというのは正しくないということです。

どこかに AD がある場合 (あるようです)、適切なセットアップにはここにすべてのユーザーが含まれます。完全なマッピングを取得する最も簡単な方法は、単純に完全な Active Directory を列挙することです。これには、すべてのマッピングが含まれている必要があります。基本的には次のように機能します。

DirectoryEntry root = new DirectoryEntry("LDAP://dc=MyCompany,dc=com");

DirectorySearcher search = new DirectorySearcher(root);
search.Filter = "(objectCategory=Person)";
search.SearchScope = SearchScope.Subtree;

search.PropertiesToLoad.Add("objectSid");
search.PropertiesToLoad.Add("displayName");

foreach(SearchResult result in search.FindAll())
{
   // grab the data - if present
   if(result.Properties["objectSid"] != null && result.Properties["objectSid"].Count > 1)
   {
       var sid = result.Properties["objectSid"][0];
   }

   if(result.Properties["displayName"] != null && result.Properties["displayName"].Count > 0)
   {
       var userName = result.Properties["displayName"][0].ToString();
   }
}
于 2015-07-10T06:25:08.483 に答える