Uruchamianie aplikacji jako...

Uruchamianie aplikacji jako...
ZI
  • Rejestracja: dni
  • Ostatnio: dni
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...

Adam.Pilorz
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2998
0

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

ZI
  • Rejestracja: dni
  • Ostatnio: dni
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.

BW
  • Rejestracja: dni
  • Ostatnio: dni
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

Kopiuj
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

Kopiuj
var
res:runinfo;
begin
res:=RunAsUser('twój_program.exe','Gość','','.');
if not res.wynik then
  ShowMessage(res.errortext);
ZI
  • Rejestracja: dni
  • Ostatnio: dni
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...

BW
  • Rejestracja: dni
  • Ostatnio: dni
0

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

ZI
  • Rejestracja: dni
  • Ostatnio: dni
0

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

PzDr's...

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.