У меня есть приложение Delphi, которое перезапускает определенную службу Windows.Олицетворять администратора для перезагрузки службы Windows
Если пользователь, выполняющий это приложение, имеет административные права (входит в группу «Администраторы»), перезапуск службы будет успешным.
Для обычного пользователя перезапуск службы завершился с ошибкой.
Это также будет успешным, если этот обычный пользователь использует «щелкните правой кнопкой мыши« Запуск от имени администратора ». Но обычный пользователь должен ввести имя пользователя и пароль администратора.
Я хочу решить это для обычного пользователя.
Моя идея - делать «олицетворять пользователя» в коде, явно выдавая себя за учетную запись локального администратора.
Но это все еще не работает.
Вот мой код:
function GetCurrUserName: string;
var
Size : DWORD;
begin
Size := MAX_COMPUTERNAME_LENGTH + 1;
SetLength(Result, Size);
if GetUserName(PChar(Result), Size) then
SetLength(Result, Size)
else
Result := '';
end;
function ConnectAs(const lpszUsername, lpszPassword: string): Boolean;
var
hToken : THandle;
begin
Result := LogonUser(PChar(lpszUsername), nil, PChar(lpszPassword), LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, hToken);
if Result then
Result := ImpersonateLoggedOnUser(hToken)
else
RaiseLastOSError;
end;
И я называю это так:
try
ConnectAs('Administrator','password');
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
// Restart the Windows service
// Done, back to the user
RevertToSelf;
Перезапуск службы потерпит неудачу. Если пользователь запускает его как Администратор (щелкните правой кнопкой мыши RunAs), он работает.
Сам олицетворение работает отлично. Я мог бы проверить его с получением текущего имени пользователя. Но почему это все еще не работает. Похоже, что пользователь олицетворяет без прав администратора.
Есть ли другой вид олицетворения?
Откуда вы получите местный пароль администратора? –
Подтвержденный пользователем пароль не является секретным. И это не собственно учетная запись администратора, а другая учетная запись, входящая в группу «Администраторы». – ewlung
Вы не проверяете возвращаемое значение 'ImpersonateLoggedOnUser'. Я не уверен, что можно будет подняться без прохождения UAC. Я бы предположил, что у вас есть две службы. Добавьте вторую службу охраны, которая может перезапустить первую службу. –