Utilizzo di CreateProcessWithLogonW

di il
5 risposte

Utilizzo di CreateProcessWithLogonW

Salve,

sto cercando di utilizzare CreateProcessWithLogonW allo scopo di eseguire un secondo exe in grado di scrivere sul registro di Windows.

Il primo exe utilizza il seguente codice per eseguire il secondo exe:


OK := ExecuteProcessWithLogon(FileName, '', '', username, '', password, errcode);
if not OK then ShowMessage('Error: ('+inttostr(errcode)+') '+SysErrorMessage(errcode))


sotto c'e' l'implementazione della funzione ExecuteProcessWithLogon.
Il problema è che il secondo exe, pur essendo eseguito con successo, non riesce comunque a scrivere del registro (cannot install into registry)
Naturalmente se accedo a Windows con l'utente suddetto posso scrivere nel registro usando regedit.
Solo se eseguo il second exe come amministratore tutto funziona. Evidentemente mi sfugge qualcosa.

grazie


 const
  LOGON_WITH_PROFILE = $00000001;

function CreateProcessWithLogonW(
  lpUsername,
  lpDomain,
  lpPassword:PWideChar;
  dwLogonFlags:dword;
  lpApplicationName: PWideChar;
  lpCommandLine: PWideChar;
  dwCreationFlags: DWORD;
  lpEnvironment: Pointer;
  lpCurrentDirectory: PWideChar;
  lpStartupInfo: PStartupInfoW;
  lpProcessInformation: PProcessInformation
): BOOL; stdcall; external 'advapi32.dll';



function ExecuteProcessWithLogon(const FileName, Params: string; Folder: string; username:string; domainname:string; password:string;
  var ErrorCode: cardinal): boolean;
var
  CmdLine:string;
  WorkingDirP: PChar;
  StartupInfo: TStartupInfow;
  ProcessInfo: TProcessInformation;
  Res:boolean;
begin
  CmdLine := '"' + FileName + '" ' + Params;

  ZeroMemory(@StartupInfo, sizeof(StartupInfo));
  StartupInfo.cb := sizeof(StartupInfo);
  StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
  StartupInfo.wShowWindow := 1;

  if Folder <> '' then WorkingDirP := PChar(Folder)
  else WorkingDirP := nil;

  SetLastError(0);
  res:=CreateProcessWithLogonW(PWideChar(UserName), PWideChar(domainname), PWideChar(password),
                               LOGON_WITH_PROFILE, nil, PWideChar(cmdline),
                               CREATE_DEFAULT_ERROR_MODE, nil, WorkingDirP, @StartupInfo, @ProcessInfo);
  if res then
  begin
    with ProcessInfo do
      begin
        CloseHandle(hThread);

        repeat
          Application.ProcessMessages;
        until MsgWaitForMultipleObjects(1, hProcess, false, INFINITE, QS_ALLINPUT) <> WAIT_OBJECT_0 + 1;

        CloseHandle(hProcess);
      end;

    ErrorCode := GetLastError;
    result:=(errorcode=0);
  end
  else begin
    ErrorCode := GetLastError;
    result:=false;
  end;
end;

5 Risposte

  • Re: Utilizzo di CreateProcessWithLogonW

    Credo che il tuo problema possa essere legato all'UAC (User Access Control), introdotto a suo tempo con Windows Vista.

    Prova a leggere questo articolo per un approfondimento sul tema.

    Ciao!
  • Re: Utilizzo di CreateProcessWithLogonW

    Ci avevo pensato ma anche disattivando l'UAC (pannello di controllo \ account utente \ modifica impostazioni di controllo \ non notificare mai) la cosa non migliora. Comunque darò un'occhiata alle info sull'articolo. Grazie.
  • Re: Utilizzo di CreateProcessWithLogonW

    Mi intrometto nel discorso, se posso.
    Sto cerando un modo per poter aprire un programma esterno, nello specifico adobe reader, all interno di una form, o un pannello.
    Cercando su google ho trovato qualcosa ma nessuna delle soluzioni incontrate funziona, avete qualche dritta?
  • Re: Utilizzo di CreateProcessWithLogonW

    Che c'entra con il thread in questione? Perché non crei un tuo thread?
  • Re: Utilizzo di CreateProcessWithLogonW

    yarendil ha scritto:


    Mi intrometto nel discorso, se posso.
    Direi di no, visto che si sta parlando d'altro e il tuo problema non ha nulla a che vedere con la problematica in questione.
    Apri una discussione separata, come da prassi.
Devi accedere o registrarti per scrivere nel forum
5 risposte