如何解决是否存在人类可读的Windows用户帐户ID,将其与SID 1:1映射?
我需要在各个进程之间传递唯一的Windows用户帐户标识符(在运行Windows 10 x64 1803或更高版本的单台计算机范围内是唯一的)。
该帐户的 SID 是很自然的选择,但是不透明的ID会使调试变得很麻烦,因此,我希望将 1:1映射到SID的可读性。 / p>
我最初只是尝试登录名称(例如“ Rosalyn”)。我可以将其映射回正确的SID,但是由于某种原因,当我使用其他用户帐户运行时,我使用的映射方法不起作用。
Windows似乎还使用了至少两种其他形式的用户帐户ID:
- username@somedomain.com
- 域名\用户名
...但是这些让我有些紧张;该文档提到并非所有用户都拥有的环境(例如LDAP,域,目录服务等)。 可以适用于所有用户,无论他们是在家中还是在公司环境中。
有人对这种事情有经验吗?如果在某处有关于如何来回映射的文档,则有加分。
编辑
...但是由于某些原因,当我使用其他用户帐户运行时,我使用的映射方法不起作用。
您能解释一下原因吗? –奋斗的太阳-MSFT
// Get the SID for this user
try
{
var ntAccount = new NTAccount(logonUser); // e.g. logonUser = "Scott"
return (SecurityIdentifier)ntAccount.Translate(typeof(SecurityIdentifier));
}
catch (Exception)
{
Trace.WriteLine($"Unable to get SID for {logonUser}","ERROR");
throw;
}
以登录用户身份运行时,此代码返回了正确的SID(S-1-5-21-4275680301-1639116052-1993100807-1001),但是在以SYSTEM帐户运行时,给定了相同的logonUser,则返回了此代码本地系统的SID(S-1-5-18)。
我认为登录用户名可能不合格,所以我尝试了"<user-domain-name>\<user-name>"
和"<machine-name>\<user-name>"
,但是无论我使用的是哪个帐户,这些都无法使用。
此外,使用诸如UserDomainName之类的内容也让我有些紧张,因为无论用户所处的环境(家庭或公司LAN)如何,我选择的任何方法都必须对所有用户有效。这是一个让我不不知道...
感到不安的情况。解决方法
您可以使用LookupAccountNameA来获取sid。
LookupAccountName函数接受系统名称和 帐户作为输入。它检索安全标识符(SID) 帐户和找到该帐户的域的名称。
使用此api无需在LocalSystem帐户的上下文中运行。
代码示例:(C ++)
#include <Windows.h>
#include <Sddl.h>
#include <stdio.h>
int main(int argc,char** argv)
{
LPCTSTR wszAccName = TEXT("domainname\\username");
LPTSTR wszDomainName = (LPTSTR)GlobalAlloc(GPTR,sizeof(TCHAR) * 1024);
DWORD cchDomainName = 1024;
SID_NAME_USE eSidType;
LPTSTR sidstring;
char sid_buffer[1024];
DWORD cbSid = 1024;
SID* sid = (SID*)sid_buffer;
if (!LookupAccountName(NULL,wszAccName,sid_buffer,&cbSid,wszDomainName,&cchDomainName,&eSidType)) {
return GetLastError();
}
if (!ConvertSidToStringSid(sid,&sidstring)) {
return GetLastError();
}
printf("%ws\n",sidstring);
return 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。