18

Samba3 对用户使用 S-1-22-1 范围内的 SID,对组使用 S-1-22-2 范围内的 SID。例如,S-1-22-1-1-10042 是具有 uid 10042 的 UNIX 用户。我希望能够将这样的 SID 映射到名称,例如“myunixaccount”,类似于 Windows 帐户的此功能映射:

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

Windows 本身能够进行这种映射,但我似乎无法找到映射算法。

添加:环境描述

测试了在 C# 中将 SID 转换为用户名的建议解决方案。它没有帮助。因此一些额外的环境描述:

  • Windows PC,加入域或独立,运行 W7 Professional,x86。
  • 位于基于 Samba 的驱动器上的文件。Samba 向域的 AD 控制器进行身份验证。
  • Samba 版本:4.0.3,在 Linux 2.6.18-238、x64 上运行。
  • Samba 的 PAM、交互式会话等。
  • AD 控制器是 W2012,在目录中有一些默认的 UNIX 扩展属性,以允许映射 UID 等。
  • .NET 框架库 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 共享。在域上使用 PC 时,它不会要求提供凭据。

一些示例,用户 gle3(在 1 中突出显示)也存在于域中,但具有不同的 SID。这里使用的 SID 是 Samba SID,如 S-1-22-1-1-10001。

在 (2) 中,您可以看到用户存在于使用的 passwd 配置中。以下当然不会产生任何结果:grep gle3 /etc/passwd,因为这些条目是从远程服务器使用的。远程服务器将 gle3 的用户 SID 映射到 UNIX uid 10001 和默认组 10003。

在 (3) 中,您可以看到默认组不存在,这就是权限无法将其解析为名称的原因。

所以很明显,Windows 以某种方式询问文件服务器:“给我这些 SID 上的数据”,Samba 文件服务器以某种方式响应:好的,那是“Unix User\gle3”和“Unix Group\10003”,但我没有组最后一个的名字。

Windows 资源管理器(荷兰语) UNIX 获取密码 UNIX 获取组

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。这可能适用于 Samba 和 Windows,尽管我过去只在 Windows 上测试过它。
  3. 远程 PC 上有通常无法解析的 SID。基本上,如果您以任何不同的方式获得 NTLM 令牌,就会发生这种情况。

实际上还有很多……证书凭证、保留用户等都是可用于登录的对象 ID - 但我会保持简单。此评论的关键要点是,虽然所有用户名都有一个 SID,但并非所有 SID 也都有一个 username

如果您在某处有 AD(您似乎有),则正确的设置包含此处的所有用户。获得完整映射的最简单方法是简单地枚举完整的活动目录。那应该包含所有映射。基本上是这样工作的:

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 回答