Recuperare nome account loggato in servizio

di il
4 risposte

Recuperare nome account loggato in servizio

Riciao a tutti.
ennesimo problema che non riesco a risolvere.
ho un servizio che gira come administrator.
questo servizio cambia delle voci di registro in HKCU.

Il prblema è che la HKCU dell utente admin non è la stessa dell'utente con cui è loggato l'utente.

dovrei quindi andare su HKUsers e prendere il sid dell'utente connesso ma proprio non ci riesco.

Ho trovato e provato un sacco di funzioni per cercare l utente ma tutte mi ritornano "system" nel servizio, mentre lanciate da una app visuale ritornano l utente connesso.

qualcuno ha qualche idea?, non so più dove sbattere la testa,

4 Risposte

  • Re: Recuperare nome account loggato in servizio

    Guarda che "system" è proprio l'utente con cui girano i servizi https://support.microsoft.com/en-us/help/120929/how-the-system-account-is-used-in-windows
  • Re: Recuperare nome account loggato in servizio

    Appunto, io avrei bisogno di accedere alla voce di registro HKCU (dell utente connesso, non di SYSTEM)
  • Re: Recuperare nome account loggato in servizio

    yarendil ha scritto:


    Riciao a tutti.
    ennesimo problema che non riesco a risolvere.
    ho un servizio che gira come administrator.
    questo servizio cambia delle voci di registro in HKCU.

    Il prblema è che la HKCU dell utente admin non è la stessa dell'utente con cui è loggato l'utente.

    dovrei quindi andare su HKUsers e prendere il sid dell'utente connesso ma proprio non ci riesco.

    Ho trovato e provato un sacco di funzioni per cercare l utente ma tutte mi ritornano "system" nel servizio, mentre lanciate da una app visuale ritornano l utente connesso.

    qualcuno ha qualche idea?, non so più dove sbattere la testa,
    Potresti usare wmic per recuperare la sid dell'utente loggato
    Il comando wmi è
    wmic useraccount where name="%username%" get sid
    scritto esattamente così (%username% è l'alias dell'utente loggato)
    Ti restituisce una stringa contenente la sid dell'utente connesso

    In delphi puoi utilizzare questo codice per fare un test
    function GetDosOutput(CommandLine: string; Work: string = 'C:\'): string;
    var
      SA: TSecurityAttributes;
      SI: TStartupInfo;
      PI: TProcessInformation;
      StdOutPipeRead, StdOutPipeWrite: THandle;
      WasOK: Boolean;
      Buffer: array[0..255] of AnsiChar;
      BytesRead: Cardinal;
      WorkDir: string;
      Handle: Boolean;
    begin
      Result := '';
      with SA do begin
        nLength := SizeOf(SA);
        bInheritHandle := True;
        lpSecurityDescriptor := nil;
      end;
      CreatePipe(StdOutPipeRead, StdOutPipeWrite, @SA, 0);
      try
        with SI do
        begin
          FillChar(SI, SizeOf(SI), 0);
          cb := SizeOf(SI);
          dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
          wShowWindow := SW_HIDE;
          hStdInput := GetStdHandle(STD_INPUT_HANDLE); // don't redirect stdin
          hStdOutput := StdOutPipeWrite;
          hStdError := StdOutPipeWrite;
        end;
        WorkDir := Work;
        Handle := CreateProcess(nil, PChar('cmd.exe /C ' + CommandLine),
                                nil, nil, True, 0, nil,
                                PChar(WorkDir), SI, PI);
        CloseHandle(StdOutPipeWrite);
        if Handle then
          try
            repeat
              WasOK := ReadFile(StdOutPipeRead, Buffer, 255, BytesRead, nil);
              if BytesRead > 0 then
              begin
                Buffer[BytesRead] := #0;
                Result := Result + Buffer;
              end;
            until not WasOK or (BytesRead = 0);
            WaitForSingleObject(PI.hProcess, INFINITE);
          finally
            CloseHandle(PI.hThread);
            CloseHandle(PI.hProcess);
          end;
      finally
        CloseHandle(StdOutPipeRead);
      end;
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    var s: string;
    begin
    s := GetDosOutput('wmic useraccount where name="%username%" get sid');
    showmessage(s);
    end;
  • Re: Recuperare nome account loggato in servizio

    Ti ringrazio, ma sembra funzionare da applicazione ma come al solito non da servizio, mi ritorna il sid relativo sempre all utente system.

    vabbè... ho "risolto" in altro modo, in pratica cmq ho anche un applicazione che gira come client e quindi questa "passa" il sid che riesce a recuperare siccome gira come utente normale, al servizio e amen, al momento lo tengo cosi'
Devi accedere o registrarti per scrivere nel forum
4 risposte