Uruchamianie aplikacji jako...

0

Szukałem na forum ale nic konkretnego nie znalazlem.

Mam np. 5 uzytkowników (WinXP). Chce napisać program który będzie miał 5 przycisków, a każdy przycisk będzie odpowiadał uzytkownikowi. Jęzeli nacisne przycisk 1 to włączy się program Notatnik z uzytkownika 1, jeśli nacisne przycisk 2 to włączy się Notatnik z uzytkownika 2 itp.

Klikając prawym przyciskiem myszy na jakąś aplikacje jest tam poleceni :"Uruchom jako..." można tam wybrać uzytkownika oraz wpisać hasło, dokładnie o takie uruchamianie mi chodzi ale poprzez program w Delphi.

Bardzo proszę o pomoc.

PzDr's...

0

Taka wskazówka: polecenie systemowe "runas /user:nazwa_użytkownika polecenie".
Po użyciu runas /? w linii poleceń wszystko stanie się jasne.

0

dzieki wielkie, juz wiem jak to wykorzystac.

PzDr's...

Lecz gdyby jeszcze ktos mial jakis pomysl to prosze pisac.

Np. jak uruchamiac ten program bez potrzeby za kazdym razem wpisywania hasla w oknie command.

0
Ziomekpfk napisał(a)

jak uruchamiac ten program bez potrzeby za kazdym razem wpisywania hasla w oknie command.

Od win 2000 możesz skorzystać z CreateProcessWithLogonW

type
  runinfo = record
    wynik:boolean;
    phandle:cardinal;
    errortext:string;
  end;

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

Function RunAsUser(const filename,username,password:string;Domena:string='.'):runinfo;
var
  StartupInfo: tStartupInfo;
  ProcessInfo: TProcessInformation;
  wfilename,wusername,wpassword,wdomena:pwidechar;
    function LastErrorText:string;
      var
        blad:cardinal;
        s:string;
    begin
      blad:=GetLastError;
      s:=SysErrorMessage(blad);
      if s='' then s:='nieznanej';
      result:=Format('Błąd nr %d o treści "%s"', [blad, s]);
    end;
begin
  FillChar (StartupInfo, SizeOf(StartupInfo), #0);
  StartupInfo.cb := SizeOf(StartupInfo);
  StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
  StartupInfo.wShowWindow := SW_SHOWNORMAL;

  GetMem( wfilename, Length( filename ) * SizeOf( WideChar ) + SizeOf(WideChar ) ) ;
  GetMem( wusername, length(username) * SizeOf( WideChar ) + SizeOf(WideChar ) ) ;
  GetMem( wpassword, length(password) * SizeOf( WideChar ) + SizeOf(WideChar ) ) ;
  GetMem( wdomena, length(Domena) * SizeOf( WideChar ) + SizeOf (WideChar));
  StringToWideChar( filename, wfilename, Length( filename ) * SizeOf(WideChar ) + SizeOf( WideChar ) ) ;
  StringToWideChar( username, wusername, Length( username ) * SizeOf(WideChar ) + SizeOf( WideChar ) ) ;
  StringToWideChar( password, wpassword, Length( password ) * SizeOf(WideChar ) + SizeOf( WideChar ) ) ;
  StringToWideChar( Domena,   wdomena ,  Length(Domena)*      SizeOf(WideChar ) + SizeOf( WideChar ) ) ;
  result.wynik:=CreateProcessWithLogonW(wusername,nil,wpassword,0, wfilename, nil,
          0, nil, nil,StartupInfo , ProcessInfo);
  if not Result.wynik then Result.errortext:=LastErrorText;
  Result.phandle:= ProcessInfo.hProcess ;
  freemem(wfilename);
  freemem(wusername);
  freemem(wpassword);
end;

a użyc np tak

var
res:runinfo;
begin
res:=RunAsUser('twój_program.exe','Gość','','.');
if not res.wynik then
  ShowMessage(res.errortext);
0

Prawie super, bo chodziło mi o takie uruchamianie, ale przy uruchamianiu programu nie jest ładowany jego profil.

Polecenie "runas" ma 2 parametry do wyboru:
"/Profile - Ładuje profil użytkownika
/No profile - Określa, że nie należy ładować profilu użytkownika. Ten parametr umożliwia szybsze ładowanie aplikacji, ale może być przyczyną nieprawidłowego funkcjonowania niektórych programów."

Wyżej opisana funkcja uruchamia program dokładnie tak jak bym sobie życzył, ale nie jest ładowany profil uzytkownika, tak jak to można zrobić w poleceniu "runas".

Prosze o kolejne pomysły.

PzDr's...

0

więc ustaw dwLogonFlags na LOGON_WITH_PROFILE :)
LOGON_WITH_PROFILE = $00000001;
zresztą poczytaj msdn

0

Dzięki Wielkie, to jest dokładnie to czego szukałem!
SUPER!

PzDr's...

1 użytkowników online, w tym zalogowanych: 0, gości: 1