-
Нашел статью: http://www.rsdn.ru/article/qna/baseserv/privedit.xmlВ начале статьи пример: "Например, чтобы служба, зарегистрированная под своей собственной учетной записью, могла запуститься, ее учетной записи должно быть предоставлено право входа в систему в качестве службы." Как эта привилегия называется? Вообще - где эти названия смотреть?
-
Нагуглил таки... SeServiceLogonRight не знаю только - оно - нет. Буду пробовать.
-
SE_TCB_NAME
-
А, в качестве службы, тогда SE_SERVICE_LOGON_NAME
-
Может кому интересно - немного причесанная http://stackoverflow.com/questions/4483728/lsaopenpolicy-is-throwing-exception-in-my-code-why
unit SetRights;
interface
uses
Windows, JclWin32;
function LsaAddAccountRights(PolicyHandle: LSA_HANDLE; AccountSid: PSID; UserRights: PLSA_UNICODE_STRING;
CountOfRights: ULONG): NTSTATUS; stdcall;
function LsaAddAccountRights; external advapi32 Name 'LsaAddAccountRights';
function AddPrivilegeToAccount(const AAccountName, APrivilege: string): DWORD;
implementation
const
STATUS_SUCCESS = 0;
function AddPrivilegeToAccount(const AAccountName, APrivilege: string): DWORD;
var
Status: NTSTATUS;
ObjectAttributes: TLsaObjectAttributes;
PolicyHandle: TLsaHandle;
Privilege: TLsaUnicodeString;
Sid: PSID;
SidLen: DWORD;
TmpDomain: string;
TmpDomainLen: DWORD;
TmpSidNameUse: TSidNameUse;
PrivilegeWStr: String;
PrivilegeWStr: WideString;
begin
ZeroMemory(@ObjectAttributes, SizeOf(ObjectAttributes));
Status := LsaOpenPolicy(nil, ObjectAttributes, POLICY_LOOKUP_NAMES, PolicyHandle);
if Status <> STATUS_SUCCESS then
begin
Result := LsaNtStatusToWinError(Status);
Exit;
end;
try
TmpDomainLen := DNLEN; SetLength(TmpDomain, TmpDomainLen);
SidLen := SECURITY_MAX_SID_SIZE;
GetMem(Sid, SidLen);
try
if LookupAccountName(nil, PChar(AAccountName), Sid, SidLen, PChar(TmpDomain), TmpDomainLen,
TmpSidNameUse) then
begin
PrivilegeWStr := APrivilege;
Privilege.Buffer := PWideChar(PrivilegeWStr);
Privilege.Length := Length(PrivilegeWStr) * SizeOf(char);
Privilege.MaximumLength := Privilege.Length;
Status := LsaAddAccountRights(PolicyHandle, Sid, @Privilege, 1);
Result := LsaNtStatusToWinError(Status);
end else
Result := GetLastError;
finally
FreeMem(Sid);
end;
finally
LsaClose(PolicyHandle);
end;
end;
end.
-
Добрый день. Возвращаясь к напечатанному. Я уже не помню, где этот код работал, пробую сейчас под 7-кой.
Результат такой. LsaAddAccountRights возвращает $C0000022, LsaNtStatusToWinError возвращает 5 - 'Отказано в доступе'.
Запускаю архив из-под админа, само собой.
Может какие-то мысли будут? Спасибо.
-
-
>Это под семёркой или под ХР?
Уже писал: "пробую сейчас под 7-кой.".
>В первом случае наверняка потребуется ещё и повышение привилегий
Запускаю экзешник из консоли администратора (cmd - запуск от имени администратора). Куда дальше повышать?
|