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;