Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Запуск программы от имени другово пользователя


Автор: DonPager 28.3.2003, 19:57
Вопрос таков:
Как запустить программу от имени другово пользователя,
т.е. имеется программа на вход которой посылается путь к другой программе,
и она в свою очередь запускает заданную программу от имени другово юзера.

Вот собственно и всё что хотелось знать.
З.Ы. пишите популярней withstupid.gif

Автор: man2002ua 28.3.2003, 20:03
CreateProcessAsUser + LogonUser
никогда не пользовался, не было необходимости...

Автор: DonPager 28.3.2003, 22:44
Может Я что нетак делаю но этот код нефига не работает:
Код

procedure TForm1.Button1Click(Sender: TObject);
var
a :Thandle;
b : TStartupInfo;
c : TProcessInformation;
UserName,
AppName,
Domain,
Passw:PAnsiChar;
begin
Username := PChar(Edit1.Text);
Domain := PChar('Domen');
Passw := PChar(Edit2.Text);
AppName := PChar('cmd');
if LogonUser(Username, Domain, Passw, LOGON32_LOGON_INTERACTIVE,
              LOGON32_PROVIDER_WINNT50,a)
 then
  begin
   Application.MessageBox('','logon OK',MB_Ok);
   if CreateProcessAsUser(a,AppName,'',nil,nil,true,0,nil,'c:\',b,c)
    then Application.MessageBox('','Start OK',MB_Ok)
    else Application.MessageBox('','ERROR',MB_Ok);
  end;
end;

Автор: man2002ua 28.3.2003, 23:53
Мда, нехватает привилегий... SE_TCB_PRIVILEGE... Удивительно конечно. К сожадению я не могу дать себе привилегию эту программно, т.к. подключен к серверу как звычайный юзер sad.gif

Ладно, если у тебя 2K или XP - скажи, и я дам другой пример. На Си говоришь или в паскаль переводить?

Автор: DonPager 29.3.2003, 02:59
у меня ХР.
если не влом, то лучше переведи,
но если нет желания, то можно и в С

Автор: man2002ua 29.3.2003, 03:12
Если честно - влом. Да и код простой...

Код
#include <windows.h>
#define UNICODE

typedef BOOL WINAPI CreateProcessWithLogonW(
 LPCWSTR lpUsername,                 // user's name
 LPCWSTR lpDomain,                   // user's domain
 LPCWSTR lpPassword,                 // user's password
 DWORD dwLogonFlags,                 // logon option
 LPCWSTR lpApplicationName,          // executable module name
 LPWSTR lpCommandLine,               // command-line string
 DWORD dwCreationFlags,              // creation flags
 LPVOID lpEnvironment,               // new environment block
 LPCWSTR lpCurrentDirectory,         // current directory name
 LPSTARTUPINFOW lpStartupInfo,       // startup information
 LPPROCESS_INFORMATION lpProcessInfo // process information]
);

void main(void)
{
 char err[256];
 HANDLE hToken, A;
 STARTUPINFOW si = {sizeof(STARTUPINFOW)};
 PROCESS_INFORMATION pi;
 LPVOID W;    
 wchar_t *pName = L"C:\\winnt\\system32\\calc.exe";
 wchar_t *aName = L"Администратор";
 wchar_t *aPassw = L"";
 wchar_t *aSrv = L"MAN";
 BOOL rez;

 HINSTANCE Hlib = LoadLibrary("c:\\winnt\\system32\\advapi32.dll");
 if(!Hlib){
         MessageBox(0,"Lib error","!",0);
         return;
 }
 W = GetProcAddress(Hlib,"CreateProcessWithLogonW");

 rez = ((CreateProcessWithLogonW*)W)(aName,aSrv,aPassw,1,
         pName,pName,0,NULL,NULL,&si, &pi);
 if(rez == 0){
      wsprintf(err, "Error [%ld] creating process!", GetLastError());
      MessageBox(0, err, "Error", 0);
 }
 return;
}

Автор: DonPager 29.3.2003, 04:51
sad.gif
всё также плохо..
логон проходит, но запуска нет

Автор: man2002ua 29.3.2003, 19:38
Код ошибки какой?
У меня калькулятор запустился под другим пользователем (локальным).

Автор: DonPager 29.3.2003, 21:17
Код ошибки 1314
ещё впросик :
использование CreatProcessAsUserW или CreatProcessAsUser или CreatProcessAsUserA принципиально?

Автор: man2002ua 29.3.2003, 21:21
НЕ понял, у меня 1314 (PRIVILEGE_NOT_HELD) вылезало только при LogonUser, а во втором случае - все как по маслу!
Какие права ты на машине имеешь и какие права имеет юзер, под кем ты запускаешь процесс?

Автор: DonPager 30.3.2003, 02:59
тестирую я имея права админа, запуская от юзверя,
а применятся будет с точностью до наоборот
и вопрос открыт :
использование CreatProcessAsUserW или CreatProcessAsUser или CreatProcessAsUserA принципиально?

Автор: serious 30.3.2003, 03:02
Юзверь с правами админа, или я что-то не понял?

Автор: XpyDi 30.3.2003, 05:45
Цитата
CreatProcessAsUserW или CreatProcessAsUser или CreatProcessAsUserA принципиально

Вообще-то такой функции, как CreatProcessAsUser вообще не существует, при компиляции она заменяеться(из-за того что гдето ) на вызов CreatProcessAsUserA(в случае использования ANSI строк) или CreatProcessAsUserW(в случае работы с Unicode строками).

Я делал, как у man2002ua все работало отлично.

Автор: man2002ua 31.3.2003, 17:09
Непонятно, почему у тебя не запускается. А стандартными методами XP, под тем же юзером - получается?

Автор: 78125 31.3.2003, 18:04
Цитата(serious @ 30.3.2003, 03:02)
Юзверь с правами админа, или я что-то не понял?

Юзверь с правами админна и есть АДМИН biggrin.gif

Автор: man2002ua 31.3.2003, 18:07
Цитата
Юзверь с правами админна и есть АДМИН

угу.

Автор: DonPager 11.4.2003, 12:39
sad.gif ну не знаю Я почему не получается не фига..
вот код :
Код

program Project1;
{$APPTYPE CONSOLE}
type
 TSTARTUPINFO = record
   cb: LongWORD;
   lpReserved, lpDesktop, lpTitle: Pointer;
   dwX,dwY,dwXSize,dwYSize,
   dwXCountChars,dwYCountChars,
   dwFillAttribute, dwFlags: LongWORD;
   wShowWindow, cbReserved2: Word;
   lpReserved2: PByte;
   hStdInput, hStdOutput, hStdError: LongWORD;
 end;

 TProcessInformation = record
   hProcess, hThread, dwProcessId, dwThreadId: LongWORD;
  end;

const
pName = 'D:\N_utils\LOG_View.exe';
aName = 'test';
aSrv  = 'ZLODEI';
aPass = 'test';

var
si: TSTARTUPINFO;
pi: TProcessInformation;

function CreateProcessWithLogonW(UserName, Domain, Password: PWideChar;
LogonFlag: LongWord; AppName,CmdLine: PWideChar; CrtFlag: LongWord; Env: LongWord;
CurentDir: PWideChar; StartInfo:TSTARTUPINFO; ProcInfo:TProcessInformation):boolean;
stdcall; external 'advapi32.dll';

begin
if not CreateProcessWithLogonW(aName,aSrv,aPass,1,pName,pName,0, 0,'',si, pi)
then writeln('Error ',GetLastError());
Readln;
end.


он компилится но не запускается sad.gif
выдаёт :
Код
Runtime error 216 at 77E00CC1

Автор: man2002ua 11.4.2003, 15:19
Учите матчасть, товарищ лейтенант! smile.gif

Код
program Test;
uses Windows;
{$APPTYPE CONSOLE}

const
 pName :WideString = 'D:\N_utils\LOG_View.exe';
 aName :WideString = 'test';
 aSrv  :WideString = 'ZLODEI'; // Че, в самом деле писюк так называется? :)
 aPass :WideString = 'test';

var
 si: TSTARTUPINFO;
 pi: TProcessInformation;

function CreateProcessWithLogonW(UserName, Domain, Password: WideString;
  LogonFlag: dword; AppName, CmdLine: WideString; CrtFlag: dword; Env: pointer;
  CurentDir: WideString; StartInfo:pointer; ProcInfo:pointer):BOOL; stdcall;
  external 'advapi32.dll';

begin
 ZeroMemory(@si, sizeof(si));
 si.cb := sizeof(si);
 if not CreateProcessWithLogonW(aName,aSrv,aPass,1,pName,pName,0, nil,'',@si, @pi)
 then writeln('Error ',GetLastError());
 Readln;
end.

Автор: man2002ua 11.4.2003, 15:19
Учите матчасть, товарищ лейтенант! smile.gif

Код
program Test;
uses Windows;
{$APPTYPE CONSOLE}

const
 pName :WideString = 'D:\N_utils\LOG_View.exe';
 aName :WideString = 'test';
 aSrv  :WideString = 'ZLODEI'; // Че, в самом деле писюк так называется? :)
 aPass :WideString = 'test';

var
 si: TSTARTUPINFO;
 pi: TProcessInformation;

function CreateProcessWithLogonW(UserName, Domain, Password: WideString;
  LogonFlag: dword; AppName, CmdLine: WideString; CrtFlag: dword; Env: pointer;
  CurentDir: WideString; StartInfo:pointer; ProcInfo:pointer):BOOL; stdcall;
  external 'advapi32.dll';

begin
 ZeroMemory(@si, sizeof(si));
 si.cb := sizeof(si);
 if not CreateProcessWithLogonW(aName,aSrv,aPass,1,pName,pName,0, nil,'',@si, @pi)
 then writeln('Error ',GetLastError());
 Readln;
end.

Автор: Первый 14.4.2003, 13:29
Я так понял, что aPass - это пароль пользователя, от имени которого зпускается программа. А если я не знаю этот пароль? Как быть?

Автор: man2002ua 14.4.2003, 13:31
Цитата
А если я не знаю этот пароль? Как быть?


застрелиться wink.gif

Автор: Teap0t 20.11.2004, 16:56
сделал также но..

я столкнулся с такой ситуацией smile
есть приложение А работающее из под системной учетной записи (WinXP)
есть необходимость запускать из приложения А другое приложение Б
под другой учетной записью (например Test)
приложене Б запускается но под учетной записью системы smile
хотя если просто запустить приложение А
(под любой другой учетной записью)
приложение Б запускается от требуемой учетной записи

Не подскажите как мне решить эту проблемму smile

Автор: Akella 25.11.2004, 11:15
Цитата
Я так понял, что aPass - это пароль пользователя, от имени которого зпускается программа. А если я не знаю этот пароль? Как быть?

есть программа SamInside для чтения инфы о пользователе в WinXP

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)