编程获取 Windows 内置帐户名称
2024-05-18 15:25:22

Windows 系统存在两个常用的内置账户:AdministratorGuest
而这两个帐户名称是可以在组策略中修改的


而一些关于帐户的 API 函数都要求提供帐户名,比如 NetUserGetInfoNetUserSetInfo
要操作系统内置帐户的时候不应该假设管理员是Administrator,游客是Guest,而应该调用相关函数获取。


微软预定义了很多 SID,结合这些 SID,再通过 LookupAccountSid 函数即可获取帐户名和域名称。
预定义 SID 需要通过 CreateWellKnownSid 函数创建,它的第一个参数指向 WELL_KNOWN_SID_TYPE 枚举类型,这就是预定义的 SID 类型标识符。
其中内置管理员帐户对应的值是WinAccountAdministratorSid,来宾帐户对应的值是WinAccountGuestSid


当我尝试这样调用时,总是返回错误码 87

1
2
3
DWORD cbSid = 0;
BOOL bSuccess = CreateWellKnownSid(WinAccountGuestSid, nullptr, nullptr, &cbSid);
DWORD dwErr = GetLastError(); // 错误 87

我在这里卡了几个小时,最终发现第2个参数不能为空,必须填写本机域 SID。
我们只需要将计算机名称传递给 LookupAccountName 函数即可查询到其 SID。
得到了内置帐户 SID 后就可以通过 LookupAccountSid 取到帐户名了。

总结

获取系统内置帐户名的流程如下:

  1. GetComputerNameEx 获取计算机名称。
  2. LookupAccountName 查询域 SID。
  3. CreateWellKnownSid 创建帐户 SID。
  4. LookupAccountSid 查询帐户名称。

相关阅读

安全标识符