Файл Zmmc.dpr. Писано под Delphi5.
==========================
program Zmmc;
uses Windows, SysUtils;
{$R *.RES}
function CreateProcessWithLogonW(lpUserName: PWideChar; lpDomain: PWideChar; 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';
var StartupInfo: TStartupInfo;
ProcessInformation: TProcessInformation;
wCommandLine: array[0..1023] of WideChar;
LastError: DWORD;
Err: string;
const sCommandLine: string = 'Приложение.exe <список параметров>';
begin
StringToWideChar(sCommandLine, wCommandLine, Length(sCommandLine)+1);
FillMemory(@StartupInfo, sizeof(StartupInfo), 0);
StartupInfo.cb := sizeof(StartupInfo);
if not CreateProcessWithLogonW(
'Юзверь', 'Домен', 'Пароль', 0,
nil, wCommandLine,
CREATE_DEFAULT_ERROR_MODE or NORMAL_PRIORITY_CLASS, nil,
nil, StartupInfo,
ProcessInformation) then begin
LastError := GetLastError;
Err := SysErrorMessage(LastError);
Err := 'Ошибка '+IntToStr(LastError)+#13+Err;
MessageBox(0, PChar(Err), '', MB_APPLMODAL+MB_ICONERROR+MB_OK);
end;
end.
==========================
Я всю командную строку затолкал в параметр lpCommandLine. Вообще-то надо приложение в lpApplicationName, а в lpCommandLine - параметры, но почему-то не работает.
По поводу безопасности. Страшная птица Продвинутый Юзверь
может подсунуть этой проге совсем другое приложение, предварительно его переименовав. Поэтому было бы полезно перед созданием процесса проверять на замену какой-нибудь хэш-функцией от содержимого исполняемого файла(да хотя бы проверить контрольную сумму или несколько байт из разных мест на совпадение). Если же доберется какой-нибудь хакер, то он под дебагером не затруднится вытащить всю информацию(если есть какие-нибудь мысли о воспрепятствовании - поделитесь), поэтому ставить в конторе, где хакеры толпами ходят - не рекомендуется
.