Конференция "WinAPI" » Программно предоставить юзеру право входа в качестве службы.
 
  • Дмитрий Белькевич (05.10.11 17:33) [0]
    Нашел статью:

    http://www.rsdn.ru/article/qna/baseserv/privedit.xml

    В начале статьи пример:

    "Например, чтобы служба, зарегистрированная под своей собственной учетной записью, могла запуститься, ее учетной записи должно быть предоставлено право входа в систему в качестве службы."

    Как эта привилегия называется? Вообще - где эти названия смотреть?
  • Дмитрий Белькевич (05.10.11 17:40) [1]
    Нагуглил таки... SeServiceLogonRight не знаю только - оно - нет. Буду пробовать.
  • Rouse_ © (05.10.11 17:49) [2]
    SE_TCB_NAME
  • Rouse_ © (05.10.11 17:51) [3]
    А, в качестве службы, тогда SE_SERVICE_LOGON_NAME
  • Дмитрий Белькевич (05.10.11 18:33) [4]
    Может кому интересно - немного причесанная

    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;
    {$IFDEF UNICODE}
     PrivilegeWStr: String;
    {$ELSE}
    PrivilegeWStr: WideString;
    {$ENDIF}
    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; // In 'clear code' this should be get by LookupAccountName
     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.

  • Дмитрий Белькевич (06.03.13 19:25) [5]
    Добрый день. Возвращаясь к напечатанному. Я уже не помню, где этот код работал, пробую сейчас под 7-кой.

    Результат такой. LsaAddAccountRights возвращает $C0000022, LsaNtStatusToWinError возвращает 5 - 'Отказано в доступе'.

    Запускаю архив из-под админа, само собой.

    Может какие-то мысли будут? Спасибо.
  • брат Птибурдукова (07.03.13 08:17) [6]
    Это под семёркой или под ХР? В первом случае наверняка потребуется ещё и повышение привилегий (смотри http://pda.delphimaster.net/?id=1357723591&n=5)
  • Дмитрий Белькевич (10.03.13 12:15) [7]
    >Это под семёркой или под ХР?

    Уже писал: "пробую сейчас под 7-кой.".

    >В первом случае наверняка потребуется ещё и повышение привилегий

    Запускаю экзешник из консоли администратора (cmd - запуск от имени администратора). Куда дальше повышать?
 
Конференция "WinAPI" » Программно предоставить юзеру право входа в качестве службы.
Есть новые Нет новых   [134430   +4][b:0][p:0.001]