Устранение проблем с назначением привилегий "Logon As A Service" в Delphi 2010 на Windows XP
Разработчики, работающие с Delphi и Object Pascal, иногда сталкиваются с проблемами, связанными с управлением привилегиями в операционной системе. Одной из таких проблем является назначение привилегии "Logon As A Service" пользователю, что может быть необходимо для запуска сервисов от имени этого пользователя. В данной статье мы рассмотрим, как решить проблему, описанную в вопросе пользователя, связанную с использованием функции LsaAddAccountRights в Delphi 2010 при работе с JEDI Windows API и JWSCL на Windows XP.
Описание проблемы
Пользователь столкнулся с тем, что после попытки назначения привилегии "Logon As A Service" пользователю с помощью функции LsaAddAccountRights, привилегия не добавляется. Это подтверждается тем, что после выполнения функции и её возврата, проверка в редакторе групповых политик показывает, что пользователь всё ещё не имеет нужной привилегии.
Анализ кода
В представленном коде есть несколько моментов, на которые стоит обратить внимание:
При открытии политики используется флаг POLICY_LOOKUP_NAMES, который не позволяет изменять учетные записи.
Необходимо использовать флаг POLICY_CREATE_ACCOUNT или MAXIMUM_ALLOWED для возможности изменения учетных записей.
В коде не проверяется возвращаемое значение функции LsaAddAccountRights. Для отладки необходимо добавить вывод кода ошибки.
Подтвержденный ответ
Для корректной работы с LsaAddAccountRights необходимо открыть политику с флагами POLICY_CREATE_ACCOUNT или POLICY_READ | POLICY_WRITE | POLICY_CREATE_SECRET | POLICY_SET_DEFAULTS | POLICY_SERVER | POLICY_ALTERNATIVE_SERVER | POLICY_READ_CLIENTS | POLICY_WRITE_CLIENTS | POLICY_TRUST_ADMIN | POLICY_CREATE_ACCOUNT | MAXIMUM_ALLOWED. Это позволит изменить учетные записи и применить необходимые привилегии.
Исправленный код
function AddPrivilegeToAccount(AAccountName, APrivilege: String): DWORD;
var
lStatus: NTSTATUS;
lObjectAttributes: TLsaObjectAttributes;
lPolicyHandle: TLsaHandle;
lPrivilege: TLsaUnicodeString;
lSid: PSID;
lSidLen: DWORD;
lTmpDomain: String;
lTmpDomainLen: DWORD;
lTmpSidNameUse: TSidNameUse;
lPrivilegeWStr: String;
begin
ZeroMemory(@lObjectAttributes, SizeOf(lObjectAttributes));
// Открываем политику с нужными правами
lStatus := LsaOpenPolicy(nil, lObjectAttributes, POLICY_CREATE_ACCOUNT or POLICY_LOOKUP_NAMES, lPolicyHandle);
// ...
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
var resultCode: DWORD = AddPrivilegeToAccount('Sam', 'SeServiceLogonRight');
ShowMessage(IntToHex(resultCode, 8));
end;
Вывод
После внесения изменений в код и корректного открытия политики с нужными правами, функция LsaAddAccountRights должна работать корректно и привилегия "Logon As A Service" будет назначена указанному пользователю. Обязательно проверяйте возвращаемое значение функции для отладки и устранения возможных ошибок.
Разработчики в Delphi 2010 на Windows XP сталкиваются с трудностями при назначении привилегии "Logon As A Service", что требует корректного использования функций управления привилегиями через JEDI Windows API и JWSCL.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.