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”,但我没有组最后一个的名字。