C#获取Guest内置账户名

Get Guest built-in account name in C#

我想用 C# 获取 Guest 内置帐户名。由于不同地区的语言不同,Guest 仅适用于英语版本 Windows,例如在西班牙语 Windows 上,Guest 为 Invitado。 我想做的是获取名称并使用我得到的名称编辑帐户,比如设置密码或向其中添加一些组。

我已经尝试过此代码:

            var sGuest = new SecurityIdentifier(WellKnownSidType.AccountGuestSid, null);
            PrincipalContext systemContext = null;
            systemContext = new PrincipalContext(ContextType.Machine);
            guestPrincipal = UserPrincipal.FindByIdentity(systemContext, IdentityType.Name, sGuest.ToString());

我得到这个错误:

System.ArgumentNullException: 'The domainSid parameter must be specified for creating well-known SID of type AccountGuestSid.

本地来宾帐户的 SID 采用 S-1-5-21domain-501 的形式,其中 domain 是计算机的 SID。因为构造来宾帐户 SID 需要域 SID,所以如果 domainSid 参数为 null,SecurityIdentifier 的构造函数将失败。您可以通过 WMI 获取机器 SID,并将其作为 domainSid 参数传递给 SecurityIdentifier 构造函数。

或者,也可以在没有机器 SID 的情况下获取来宾帐户。这样做的一种方法是使用 PrincipalSearcher 来识别其 SID 是众所周知的来宾帐户 SID 的用户帐户,并查询其 Name 属性 以获取本地名称帐号:

// using System.Security.Principal;
// using System.DirectoryServices.AccountManagement;
new PrincipalSearcher(new UserPrincipal(new PrincipalContext(ContextType.Machine)))
                .FindAll()
                .Single(a => a.Sid.IsWellKnown(WellKnownSidType.AccountGuestSid))
                .Name // returns the local account name, e.g., 'Guest'