![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как из службы запустить программу? [D5, D6, D7, NT4, Win2k, WinXP]
Дармидон © (2005-01-10 12:52:00)Как из службы (именно из службы /TService/) запустить программу?
BiN (2005-01-10 15:08:00) [21]kaZaNoVa © (10.01.05 14:51) [6]
В твой код не предоставляет пользователю возможность "юзать прогу, запушенную с его правами". Пользователь в таком виде вообще не сможет "юзать прогу", ибо весь (возможный) вывод будет осуществляться на десктоп сервисов.
kaZaNoVa (2005-01-10 14:51:00) [22]Игорь Шевченко © (10.01.05 14:48) [5]
если он хочет запустить прогу не от имени SYSTEM(или какой-та, от которой сервис работает)
так как нормальный юзер должен юзать прогу, запушенную с его правами:))
Игорь Шевченко (2005-01-10 14:48:00) [23]kaZaNoVa © (10.01.05 14:41) [4]
Ну и нафига такие извращения ?
kaZaNoVa (2005-01-10 14:41:00) [24]
unit ProcessWithLogon;
interface
uses Windows, SysUtils;
const
LOGON_WITH_PROFILE = $1;
LOGON_NETCREDENTIALS_ONLY = $2;
function CreateProcessWithLogonW(
UserName,
Domain,
Password: PWideChar;
dwLogonFlags: DWORD;
lpApplicationName,
lpCommandLine: PWideChar;
dwCreationFlags: DWORD;
lpEnvironment: Pointer;
lpCurrentDirectory: PWideChar;
const lpStartupInfo: TStartupInfo;
var lpProcessInformation: TProcessInformation): BOOL; stdcall;
function StartProcessWithLogon(
const strUsername, // Логин
strDomain, // Домен
strPassword, // Пароль
strCommandLine: WideString // запускаемая программа с путем к ней
): Boolean;
implementation
function CreateProcessWithLogonW; external advapi32 name 'CreateProcessWithLogonW';
function StartProcessWithLogon(
const strUsername, // Логин
strDomain, // Домен
strPassword, // Пароль
strCommandLine: WideString // запускаемая программа с путем к ней
): Boolean;
var
pi: TProcessInformation;
si:TStartupInfo;
bResult: boolean;
St: string;
begin
Result := False;
ZeroMemory(@si,sizeof(TSTARTUPINFO));
si.cb:= sizeof(TSTARTUPINFO);
si.lpDesktop:=nil;
bResult := CreateProcessWithLogonW(
PWideChar(strUsername),
PWideChar(strDomain),
PWideChar(strPassword),
LOGON_WITH_PROFILE,
PWideChar(strCommandLine),
nil,
0,
nil,
nil,
si,
pi
);
if not bResult then
begin
St := SysErrorMessage(Windows.GetLastError);
MessageBox(0, PAnsiChar(St), 'Ошибка!', MB_OK or MB_ICONERROR)
end
else
begin
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
end;
Result:=bResult;
end;
end.
юзать так
procedure TForm1.Button2Click(Sender: TObject);
//Var U,P,d,c:WideChar;
begin
StartProcessWithLogon(Edit1.Text,Edit4.Text,Edit2.Text,Edit3.Text);
end;
Игорь Шевченко (2005-01-10 13:23:00) [25]Gero © (10.01.05 13:20) [2]
CreateProcess, однако.
С уважением,
Gero (2005-01-10 13:20:00) [26]ShellExecute
BiN (2005-01-10 13:11:00) [27]Также, как и из любого другого процесса