Make(delphi) ver(4.01 build 175) Add(MainForm,2953706,91,98) { Width=310 Height=261 Caption="Demo RunAsExt" BorderStyle=3 Position=1 } Add(InlineCode,633601,273,98) { WorkPoints=#83:doRunAsExt=запуск программы от учётной записи, командная строка передаётся в потоке| EventPoints=#21:onLog=Вывод сообщений| DataPoints=#14:UserName=Логин|15:Password=Пароль|12:Domain=Домен| Code=#15:unit HiAsmUnit;|0:|9:interface|0:|30:uses kol,windows, Share,Debug;|0:|48:function CreateProcessWithLogonW(user:pwidechar;|50: domain:pwidechar;|50: passw:pwidechar; |47: flags: DWORD; |62: lpApplicationName: PwideChar;|58: lpCommandLine: PwideChar;|57: dwCreationFlags: DWORD; |56: lpEnvironment: Pointer;|64: lpCurrentDirectory: PWideChar; |67: const lpStartupInfo: TStartupInfo;|120: var lpProcessInformation: TProcessInformation): BOOL; stdcall; external 'advapi32.dll';|0:|68:function runas(username, password, domain, command: string): string;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|0:|9: public|21: Command: string;|47: UserName,Password,Domain,onLog :THI_Event;|50: procedure doRunAsExt(var dt:TData; idx:word);|5: end;|0:|14:implementation|0:|68:function runas(username, password, domain, command: string): string;|3:var|19: si: tstartupinfo;|26: pi: tprocessinformation;|59: puser, ppass, pdomain, pprogram: array [0..255] of wchar;|19: lasterror: dword;|23: resultstring: string;|5:begin|30: zeromemory(@si, sizeof(si));|20: si.cb:=sizeof(si);|30: zeromemory(@pi, sizeof(pi));|0:|41: stringtowidechar(username, puser, 255);|41: stringtowidechar(password, ppass, 255);|41: stringtowidechar(domain, pdomain, 255);|43: stringtowidechar(command, pprogram, 255);|0:|32: createprocesswithlogonw(puser,|34: pdomain,|32: ppass,|50: 1, //logon_with_profile,|35: pprogram,|30: nil,|76: create_default_error_mode or create_new_console or|78: create_new_process_group or create_separate_wow_vdm,|30: nil,|30: nil,|29: si,|30: pi);|0:|26: lasterror:=getlasterror;|19: case lasterror of|31: 0: resultstring:='success';|39: 86: resultstring:='wrong password';|53: 1326: resultstring:='wrong username or password';|66: 1327: resultstring:='logon failure. user account restriction';|114: 1385: resultstring:='logon failure. the user has not been granted the requested logon type at this computer.';|38: 2: resultstring:='file not found';|37: 5: resultstring:='access denied';|6: else|46: resultstring:='error '+int2str(lasterror);|6: end;|23: result:=resultstring;|4:end;|0:|33:procedure THiAsmClass.doRunAsExt;|37:var login,pass,strdomain,log: string;|16: data: TData;|5:begin|26: Command := ToString(dt);|40: login := ReadString(data,UserName,'');|40: pass := ReadString(data,Password,'');|43: strdomain := ReadString(data,Domain,'');|48: log := runas(login, pass, strdomain, Command);|25: _hi_OnEvent(onLog,log);|4:end;|4:end.| link(onLog,1064609:doAdd,[]) link(UserName,14007059:Text,[]) link(Password,11705908:Text,[(286,81)(321,81)]) link(Domain,15327989:Text,[(293,86)(363,86)]) } Add(Edit,14007059,273,42) { Left=70 Top=5 Width=120 Text="Администратор" } Add(Label,14131695,77,42) { Left=5 Top=10 Width=33 Height=17 Caption="Login:" } Add(Label,5728002,84,49) { Left=5 Top=35 Width=53 Height=17 Caption="Password:" } Add(Edit,11705908,315,42) { Left=70 Top=30 Width=120 Text="" } Add(Button,13227859,168,98) { Left=205 Top=5 Width=85 Height=70 Caption="Run" link(onClick,2917291:doExecute,[]) } Add(Memo,1064609,329,98) { Left=10 Top=85 Width=280 Height=135 ScrollBars=3 } Add(ODialog,2917291,217,98) { Filter="All EXE files|*.exe" Title="Open exe file" link(onExecute,633601:doRunAsExt,[]) } Add(Label,12859943,91,56) { Left=5 Top=60 Width=43 Height=17 Caption="Domain:" } Add(Edit,15327989,357,42) { Left=70 Top=55 Width=120 Text="" }