Получить имя гостя встроенной учетной записи в C # - PullRequest
0 голосов
/ 09 ноября 2019

Я хочу получить Guest имя встроенной учетной записи с C #. Поскольку язык отличается в разных регионах, а 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.

1 Ответ

2 голосов
/ 09 ноября 2019

SID локальной гостевой учетной записи принимает форму S-1-5-21domain-501, где domain - это SID машины. Поскольку SID домена требуется для создания SID гостевой учетной записи, конструктор со значением SecurityIdentifier завершается ошибкой, если параметр domainSid имеет значение NULL. Вы можете получить SID машины через WMI и передать его в качестве аргумента 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'
...