Newsgroup: it.comp.lang.delphi
Titolo: [D6][WIN2000][Lungo] Consulenza a pagamento CreateProcess e privilegi utente.

Salve,
chiedo questa consulenza a pagamento per risolvere un problema che dopo 
2 settimane sono riuscito a tracciare ma, a causa di mancanza di tempo, 
non riesco a risolvere:
Ho la funzione:
// -------- cut -------- //
function RunDosInMemo(DosApp: string): string;
const
  ReadBuffer = 2400;
var
  Security: TSecurityAttributes;
  ReadPipe, WritePipe: THandle;
  start: TStartUpInfo;
  ProcessInfo: TProcessInformation;
  Buffer: Pchar;
  BytesRead: DWord;
  Apprunning: DWord;
begin
  Result := 's';
  with Security do begin
    nlength := SizeOf(TSecurityAttributes);
    binherithandle := true;
    lpsecuritydescriptor := nil;
  end;
  if Createpipe(ReadPipe, WritePipe,
    @Security, 0) then begin
    Buffer := AllocMem(ReadBuffer + 1);
    FillChar(Start, Sizeof(Start), #0);
    start.cb := SizeOf(start);
    start.hStdOutput := WritePipe;
    start.hStdInput := ReadPipe;
    start.dwFlags := STARTF_USESTDHANDLES +
      STARTF_USESHOWWINDOW;
    start.wShowWindow := SW_HIDE;
    if CreateProcess(nil,
      PChar(DosApp),
      @Security,
      @Security,
      true,
      NORMAL_PRIORITY_CLASS,
      nil,
      nil,
      start,
      ProcessInfo)
      then
    begin
      repeat
        Apprunning := WaitForSingleObject
          (ProcessInfo.hProcess, 100);
        Application.ProcessMessages;
      until (Apprunning <> WAIT_TIMEOUT);
      repeat
        BytesRead := 0;
        ReadFile(ReadPipe, Buffer[0],
          ReadBuffer, BytesRead, nil);
        Buffer[BytesRead] := #0;
        OemToAnsi(Buffer, Buffer);
        Result := Result + string(Buffer);
      until (BytesRead < ReadBuffer);
    end;
    FreeMem(Buffer);
    CloseHandle(ProcessInfo.hProcess);
    CloseHandle(ProcessInfo.hThread);
    CloseHandle(ReadPipe);
    CloseHandle(WritePipe);
  end;
end;
// -------- end cut -------- //
Questa funzione mi serve per eseguire un programma console esterno 
(signcode.exe di microsoft).
Il problema e che sotto windows 2000 se viene eseguito da utenti 
facenti parte del gruppo Users (o PowerUsers, Administrators etc.) con 
i privilegi:
  SeChangeNotifyPrivilege
  SeUndockPrivilege
  SeInteractiveLogonRight
  SeNetworkLogonRight
Il programma esterno viene eseguito in modo corretto.
Se viene eseguito dall'utente IWAM_MASTER (IWAM_domainname) con i 
privilegi:
  SeNetworkLogonRight
  SeBatchLogonRight
Il programma esterno non viene eseguito in modo corretto.
La consulenza che si richiede riguarda la possibilita di elevare i 
privilegi alla parte di codice interessata (CreateProcess credo) in 
modo da permettere al programma esterno di completarsi correttamente.
Attendo Vs. offerte (in privato se preferite).
Un cordiale saluto.
P.S. Mi scuso per l'OT ma mi sono esaurito su questo problema :(.

 non riesco a risolvere:
[...CUT Procedura...]
Forse sarà una domanda stupida, e ti premetto che non ho mai tentato
questa strada.
La funzione CreateProcessAsUser(...) non fa al tuo caso?
Da Win32 Developer's References:
The CreateProcessAsUser function creates a new process and its primary
thread. The new process then executes a specified executable file. The
CreateProcessAsUser function is similar to the CreateProcess function,
except that the new process runs in the security context of the user
represented by the hToken parameter. By default, the new process is
non-interactive, that is, it runs on a desktop that is not visible and
cannot receive user input. Also, by default, the new process inherits the
environment of the calling process, rather than the environment associated
with the specified user.
Saluti,
Carmine

 La funzione CreateProcessAsUser(...) non fa al tuo caso?
[cut]
CreateProcessAsUser, LogonUser, CreateProcessWithLogon, son 
osicuramente funzioni che mi potrebbero essere utili, ma ho bisogno di 
qualcuno che abbia gia implementato la cosa e che questa funzioni in 
modo da non dovermi mettere a studiare per poter consegnare il lavoro 
(e l'ultima funzionalita che manca :(( ).
Ho implementato CreateProcessWithLogonW ma mi continua a dare Result = 
false, e non riesco a capire perche :(.
Ho trovato che se metto domain = '.' "dovrebbe" fare l'autenticazione 
solo sul database utenti locale. 
chiunque mi risolva il problema sara ben ricompensato.
Grazie.
// -------- cut -------- //
function CreateProcessWithLogonW(lpszUsername, lpszDomain, lpszPassword:
 PChar;
  dwLogonFlags: DWORD; lpApplicationName: PChar; lpCommandLine: PChar;
  dwCreationFlags: DWORD; lpEnvironment: Pointer; lpCurrentDirectory: 
PChar;
  const lpStartupInfo: TStartupInfo;
  var lpProcessInformation: TProcessInformation): boolean; stdcall; 
external 'advapi32.dll' name 'CreateProcessWithLogonW';
const LOGON_WITH_PROFILE = $00000001;
implementation
function ExecAndWait(const Filename, Params: string; Username, Domain, 
Password: string; WindowState: word): boolean;
var
  SUInfo: TStartupInfo;
  ProcInfo: TProcessInformation;
  CmdLine: string;
begin
  { Enclose filename in quotes to take care of long filenames with 
spaces. }
  CmdLine := '"' + Filename + '" ' + Params;
  FillChar(SUInfo, SizeOf(SUInfo), #0);
  with SUInfo do
  begin
    cb := SizeOf(SUInfo);
    dwFlags := STARTF_USESHOWWINDOW;
    wShowWindow := WindowState;
  end;
  Result := CreateProcessWithLogonW(PChar(Username), PChar(Domain), 
PChar(Password),
    LOGON_WITH_PROFILE, PChar(Filename), PChar(CmdLine), 
CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,
    nil, nil, SUInfo, ProcInfo);
  { Wait for it to finish. }
  if Result then
  begin
    WaitForSingleObject(ProcInfo.hProcess, INFINITE);
     { Clean up the handles. }
    CloseHandle(ProcInfo.hProcess);
    CloseHandle(ProcInfo.hThread);


 chiunque mi risolva il problema sara ben ricompensato.
Da quello che ho trovato in giro:
Username deve essere impostato al nome dell'utente o deve essere del tipo:
nomeutente@dominio
in questo caso, il campo domain può essere nil.
L'errore che mi restituisce è che lo Username o la password non esistono.