Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как использовать CreateProcessAsUser? [D5, WinXP]


МАКСЮХА ©   (2004-02-18 16:18:00) 

Помогите разобраться в использовании CreateProcessAsUser.
Нужно запустить приложение в ХР из другой учетной записи


Игорь Шевченко   (2004-02-19 14:36:00) [1]

МАКСЮХА ©   (19.02.04 14:32)

Открой control panel, найди там Сеть и ткни на нее. Там будет написано имя компьютера и рабочая группа (раз к сети не подключен).

P.S. Пример этот изначально был написан в точно такой же ситуации (дома, без сети)


МАКСЮХА   (2004-02-19 14:32:00) [2]


> Имя домена или рабочей группы, в которую входит пользователь.

Например?
Будем считать что комп к сети не подключен, никаких сетевых роб. групп нет.
Тогда как определить этот параметр, может по имени компьютера?
Это я уже пробовал, но ничего не выходит...


Игорь Шевченко   (2004-02-19 14:20:00) [3]

//  Logon failure: unknown user name or bad password.
//
#define ERROR_LOGON_FAILURE              1326L


> что подразумеваеться под параметром lpDomain???


Имя домена или рабочей группы, в которую входит пользователь.


МАКСЮХА   (2004-02-19 14:14:00) [4]

Это снова Я! С плохими новостями...
Проверил приведенный пример - НЕ Работает!!!

Win32 Error
Code 1326

Все ввожу правильно, но есть вопрос - что подразумеваеться под параметром lpDomain???


МАКСЮХА   (2004-02-18 18:35:00) [5]

Спасибо


Игорь Шевченко   (2004-02-18 18:08:00) [6]

Поиск, дружище, поиск...оно рулез.

unit main;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TfMain = class(TForm)
   Button: TButton;
   procedure ButtonClick(Sender: TObject);
 end;

var
 fMain: TfMain;

implementation
uses
 HSAdvApi;

{$R *.dfm}

procedure TfMain.ButtonClick(Sender: TObject);
begin
 MyCreateProcess();
end;

procedure TfMain.MyCreateProcess;
const
 UserName : WideString = 'TESTUSER';
 Password : WideString = 'testuser';
 ConstCommandLine : String = 'CMD.EXE';
 Title : WideString = 'Test process';
 Domain : WideString = 'WORKGROUP';
var
 MyStartupInfo : STARTUPINFO;
 ProcessInfo : PROCESS_INFORMATION;
 CommandLine : array[0..512] of WideChar;
begin
 FillChar(MyStartupInfo, SizeOf(MyStartupInfo), 0);
 MyStartupInfo.cb := SizeOf(MyStartupInfo);
 StringToWideChar(ConstCommandLine, CommandLine,
    Sizeof(CommandLine) div SizeOf(WideChar));
 MyStartupInfo.lpTitle := PWideChar(Title);
 if not CreateProcessWithLogonW (PWideChar(UserName), PWideChar(Domain),
     PWideChar(Password), LOGON_WITH_PROFILE, nil,
     CommandLine, 0, nil, nil, @MyStartupInfo, @ProcessInfo) then
   RaiseLastWin32Error()
 else begin
   CloseHandle(ProcessInfo.hProcess);
   CloseHandle(ProcessInfo.hThread);
 end;
end;

end.


unit HSAdvApi;

interface
uses
 Windows;

function CreateProcessWithLogonW (const lpUsername : PWideChar;
 const lpDomain : PWideChar; const lpPassword : PWideChar;
 dwLogonFlags : DWORD; const lpApplicationName : PWideChar;
 lpCommandLine : PWideChar; dwCreationFlags : DWORD;
 lpEnvironment : Pointer; const lpCurrentDirectory : PWideChar;
 lpStartupInfo : PStartupInfo;
 lpProcessInfo : PProcessInformation) : Boolean; stdcall;

const
 LOGON_WITH_PROFILE = $00000001;
 LOGON_NETCREDENTIALS_ONLY = $00000002;
 LOGON_ZERO_PASSWORD_BUFFER = $80000000;

implementation
uses
 SysUtils;

{ ADVAPI32.DLL functions }
type
 TCreateProcessWithLogonW =
   function (const lpUsername : PWideChar;
 const lpDomain : PWideChar; const lpPassword : PWideChar;
 dwLogonFlags : DWORD; const lpApplicationName : PWideChar;
 lpCommandLine : PWideChar; dwCreationFlags : DWORD;
 lpEnvironment : Pointer; const lpCurrentDirectory : PWideChar;
 lpStartupInfo : PStartupInfo;
 lpProcessInfo : PProcessInformation) : Boolean; stdcall;

const
 DllName = 'advapi32.dll';

var
 DllHandle : THandle;
 _CreateProcessWithLogonW : TCreateProcessWithLogonW;

function InitLib : Boolean;
begin
 if DllHandle = 0 then
   if Win32Platform = VER_PLATFORM_WIN32_NT then begin
     DllHandle := LoadLibrary(DllName);
     if DllHandle <> 0 then begin
       @_CreateProcessWithLogonW := GetProcAddress(DllHandle,
         'CreateProcessWithLogonW');
     end;
   end;
 Result := (DllHandle <> 0);
end;

function NotImplementedBool : Boolean;
begin
 SetLastError (ERROR_CALL_NOT_IMPLEMENTED);
 Result := false;
end;

function CreateProcessWithLogonW (const lpUsername : PWideChar;
 const lpDomain : PWideChar; const lpPassword : PWideChar;
 dwLogonFlags : DWORD; const lpApplicationName : PWideChar;
 lpCommandLine : PWideChar; dwCreationFlags : DWORD;
 lpEnvironment : Pointer; const lpCurrentDirectory : PWideChar;
 lpStartupInfo : PStartupInfo;
 lpProcessInfo : PProcessInformation) : Boolean; stdcall;
begin
 if InitLib and Assigned(_CreateProcessWithLogonW) then
   Result := _CreateProcessWithLogonW(lpUsername, lpDomain, lpPassword,
     dwLogonFlags, lpApplicationName, lpCommandLine, dwCreationFlags,
     lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInfo)
 else
   Result := NotImplementedBool;
end;

initialization
finalization
 if DllHandle <> 0 then
   FreeLibrary(DllHandle);
end.


Cobalt   (2004-02-18 16:26:00) [7]

Справку читал? И...?
Рассказывай, что понял из справки/MSDN.
А мы тебе потом объясним, что ты понял неправильно.


Наверх

Титульная страница Поиск, карта сайта Написать письмо