编程获取 Windows 内置帐户名称
2024-05-18 15:25:22
Windows 系统存在两个常用的内置账户:Administrator
和Guest
。
而这两个帐户名称是可以在组策略中修改的
而一些关于帐户的 API 函数都要求提供帐户名,比如 NetUserGetInfo 和 NetUserSetInfo。
要操作系统内置帐户的时候不应该假设管理员是Administrator
,游客是Guest
,而应该调用相关函数获取。
微软预定义了很多 SID,结合这些 SID,再通过 LookupAccountSid 函数即可获取帐户名和域名称。
预定义 SID 需要通过 CreateWellKnownSid 函数创建,它的第一个参数指向 WELL_KNOWN_SID_TYPE 枚举类型,这就是预定义的 SID 类型标识符。
其中内置管理员帐户对应的值是WinAccountAdministratorSid
,来宾帐户对应的值是WinAccountGuestSid
。
当我尝试这样调用时,总是返回错误码 87
1 | DWORD cbSid = 0; |
我在这里卡了几个小时,最终发现第2个参数不能为空,必须填写本机域 SID。
我们只需要将计算机名称传递给 LookupAccountName 函数即可查询到其 SID。
得到了内置帐户 SID 后就可以通过 LookupAccountSid 取到帐户名了。
总结
获取系统内置帐户名的流程如下:
- 用 GetComputerNameEx 获取计算机名称。
- 用 LookupAccountName 查询域 SID。
- 用 CreateWellKnownSid 创建帐户 SID。
- 用 LookupAccountSid 查询帐户名称。