Как получить локализованное имя встроенной учетной записи Windows для CreateProcessWithLogonW
При работе с встроенными учетными записями Windows в коде на языке Pascal (Delphi) может возникнуть проблема с необходимостью использования локализованных имен для выполнения процесса под учетной записью администратора. В данной статье мы рассмотрим, как можно решить эту задачу, используя примеры кода и рекомендации, основанные на материале из контекста.
Описание проблемы
При использовании функции CreateProcessWithLogonW для запуска процесса под учетной записью, такой как "Администратор", необходимо передать локализованное имя учетной записи. Например, в французской локализации имя "Администратор" будет "Administrat_eur_". Если передать функцию стандартное англоязычное имя "Administrator", это приведет к ошибке ERROR_LOGON_FAILURE.
Получение локализованного имени учетной записи
Для получения локализованного имени учетной записи можно использовать SID (Security Identifier). Однако, для получения SID встроенной учетной записи, необходимо пройти через цепочку функций, что может быть избыточным для такой простой задачи, как получение строки с доменом.
Альтернативный способ
В альтернативном ответе пользователя упоминается, что можно использовать LsaOpenPolicy, LsaQueryInformationPolicy с PolicyAccountDomainInformation, CreateWellKnownSid с WinAccountAdministratorSid и LsaLookupSids. Это более прямой и эффективный способ получения необходимого SID.
Подтвержденный ответ
Использование указанной альтернативной цепочки вызовов позволяет получить SID встроенной учетной записи без необходимости получения SID текущего пользователя и последующего анализа. Это упрощает задачу и делает код более оптимальным.
Пример кода
uses
Winapi.Windows,
Winapi.Securidds;
function GetAdminSid(out Sid: PSecurtyID): Boolean;
var
PolicyHandle: PLSA_HANDLE;
DomainInfo: PLSA_UNICODE_STRING;
AdminSid: PWinAccountSidType;
begin
Result := LsaOpenPolicy(nil, POLICY_VIEW_LOCAL, PolicyHandle);
if not Result then
Exit(False);
Result := LsaQueryInformationPolicy(PolicyHandle, PolicyAccountDomainInformation, DomainInfo);
if not Result then
Exit(False);
SetLength(AdminSid, SizeOf(WinAccountSidType));
with AdminSid^ do
begin
SidIdentifierAuthority := DomainInfo^.SidIdentifierAuthority;
SidSubAuthority := WinAccountAdministratorSid;
end;
Result := CreateWellKnownSid(SidTypeWinAccount, AdminSid, Sid[0]);
if not Result then
Exit(False);
// Дополнительные шаги для использования полученного SID...
end;
Этот код демонстрирует, как можно получить SID для учетной записи администратора, используя информацию о домене из политик безопасности. Полученный SID затем можно использовать для получения локализованного имени учетной записи.
Заключение
Для получения локализованного имени встроенной учетной записи Windows для использования в CreateProcessWithLogonW следует применять методы, основанные на работе с SID и доменной информацией политик безопасности. Это позволяет избежать лишних шагов и упрощает процесс разработки.
Обратите внимание на возможные проблемы, такие как отключение учетной записи администратора, и убедитесь, что пользователь знает пароль для входа под этой учетной записью.
Описание: При работе с встроенными учетными записями Windows в Delphi необходимо использовать локализованные имена для корректной работы функции `CreateProcessWithLogonW`, чтобы избежать ошибки `ERROR_LOGON_FAILURE`.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.