如一个程序要有以下的命令来运行
runas /env /savecred /user:hhql "c:\qlnetbar\bc2\bc2"
我现在的问题是如何在Delphi中用代码来代替 runas /env /savecred /user:hhql 的功能,因为我要监视 c:\qlnetbar\bc2\bc2 的运行情况,所以 c:\qlnetbar\bc2\bc2 必须要由我用Delphi写的程序来运行请高手指教。

解决方案 »

  1.   

    我以前问过的,http://community.csdn.net/Expert/TopicView3.asp?id=4161861
      

  2.   

    alphax以前问过的,http://community.csdn.net/Expert/TopicView3.asp?id=4161861
      

  3.   

    如果你用XP或2000,可以用下面的API:CreateProcessWithLogonW
    type
      _STARTUPINFOW = record
        cb: DWORD;
        lpReserved: LPWSTR;
        lpDesktop: LPWSTR;
        lpTitle: LPWSTR;
        dwX: DWORD;
        dwY: DWORD;
        dwXSize: DWORD;
        dwYSize: DWORD;
        dwXCountChars: DWORD;
        dwYCountChars: DWORD;
        dwFillAttribute: DWORD;
        dwFlags: DWORD;
        wShowWindow: Word;
        cbReserved2: Word;
        lpReserved2: PByte;
        hStdInput: THandle;
        hStdOutput: THandle;
        hStdError: THandle;
      end;
      STARTUPINFOW = _STARTUPINFOW;function CreateProcessWithLogonW(lpUserName, lpDomain, lpPassword: LPCWSTR;
      dwLogonFlags: DWORD; lpApplicationName: LPCWSTR; lpCommandLine: LPWSTR;
      dwCreationFlags: DWORD; lpEnvironment: Pointer; lpCurrentDirectory: LPCWSTR;
      const lpStartupInfo: STARTUPINFOW; var lpProcessInformation: PROCESS_INFORMATION): BOOL; stdcall;
      external advapi32 Name 'CreateProcessWithLogonW'procedure TForm1.Button2Click(Sender: TObject);
    var
      STARTUPINFO: StartupInfoW;
      ProcessInfo: TProcessInformation;
      AUser, ADomain, APass, AExe: WideString;
    const
      LOGON_WITH_PROFILE = $00000001;
      LOGON_NETCREDENTIALS_ONLY = $00000002;
    begin
      FillChar(STARTUPINFO, SizeOf(StartupInfoW), #0);
      STARTUPINFO.cb := SizeOf(StartupInfoW);
      STARTUPINFO.dwFlags := STARTF_USESHOWWINDOW;
      STARTUPINFO.wShowWindow := SW_SHOW;
      AUser := edtUser.Text;
      ADomain := edtDomain.Text;
      APass := edtPass.Text;
      AExe := edtExe.Text;
      if not CreateProcessWithLogonW(PWideChar(AUser), PWideChar(ADomain),
        PWideChar(APass),
        LOGON_WITH_PROFILE, nil, PWideChar(AExe),
        NORMAL_PRIORITY_CLASS, nil, nil, STARTUPINFO, ProcessInfo) then
        RaiseLastOSError;
    end;已经测试通过 
    如果你用XP或2000,可以用下面的API:CreateProcessWithLogonW
    type
      _STARTUPINFOW = record
        cb: DWORD;
        lpReserved: LPWSTR;
        lpDesktop: LPWSTR;
        lpTitle: LPWSTR;
        dwX: DWORD;
        dwY: DWORD;
        dwXSize: DWORD;
        dwYSize: DWORD;
        dwXCountChars: DWORD;
        dwYCountChars: DWORD;
        dwFillAttribute: DWORD;
        dwFlags: DWORD;
        wShowWindow: Word;
        cbReserved2: Word;
        lpReserved2: PByte;
        hStdInput: THandle;
        hStdOutput: THandle;
        hStdError: THandle;
      end;
      STARTUPINFOW = _STARTUPINFOW;function CreateProcessWithLogonW(lpUserName, lpDomain, lpPassword: LPCWSTR;
      dwLogonFlags: DWORD; lpApplicationName: LPCWSTR; lpCommandLine: LPWSTR;
      dwCreationFlags: DWORD; lpEnvironment: Pointer; lpCurrentDirectory: LPCWSTR;
      const lpStartupInfo: STARTUPINFOW; var lpProcessInformation: PROCESS_INFORMATION): BOOL; stdcall;
      external advapi32 Name 'CreateProcessWithLogonW'procedure TForm1.Button2Click(Sender: TObject);
    var
      STARTUPINFO: StartupInfoW;
      ProcessInfo: TProcessInformation;
      AUser, ADomain, APass, AExe: WideString;
    const
      LOGON_WITH_PROFILE = $00000001;
      LOGON_NETCREDENTIALS_ONLY = $00000002;
    begin
      FillChar(STARTUPINFO, SizeOf(StartupInfoW), #0);
      STARTUPINFO.cb := SizeOf(StartupInfoW);
      STARTUPINFO.dwFlags := STARTF_USESHOWWINDOW;
      STARTUPINFO.wShowWindow := SW_SHOW;
      AUser := edtUser.Text;
      ADomain := edtDomain.Text;
      APass := edtPass.Text;
      AExe := edtExe.Text;
      if not CreateProcessWithLogonW(PWideChar(AUser), PWideChar(ADomain),
        PWideChar(APass),
        LOGON_WITH_PROFILE, nil, PWideChar(AExe),
        NORMAL_PRIORITY_CLASS, nil, nil, STARTUPINFO, ProcessInfo) then
        RaiseLastOSError;
    end;已经测试通过 
    CreateProcessWithLogonW
      

  4.   

    请问楼上,我要用
    runas /env /savecred /user:hhql "c:\qlnetbar\bc2\bc2"
    来运行 "c:\qlnetbar\bc2\bc2" 然后监视 "c:\qlnetbar\bc2\bc2" 什么时候运行完毕,怎么办????
    请再指教一次哦
      

  5.   

    我也觉得是用 CreateProcessWithLogonW
    里面有个参数
    lpProcessInfo 的参数,访问其变量:hProcess用 waitforsingleObject(lpProcessInfo.hProcess) 可以等待 运行完毕