<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    konhon

    忘掉過去,展望未來。找回自我,超越自我。
    逃避不一定躲的過, 面對不一定最難過, 孤單不一定不快樂, 得到不一定能長久, 失去不一定不再擁有, 可能因為某個理由而傷心難過, 但我卻能找個理由讓自己快樂.

    Google

    BlogJava 首頁 新隨筆 聯系 聚合 管理
      203 Posts :: 0 Stories :: 61 Comments :: 0 Trackbacks

    如一個程序要有以下的命令來運行
    runas /env /savecred /user:hhql "c:\qlnetbar\bc2\bc2"
    我現在的問題是如何在Delphi中用代碼來代替 runas /env /savecred /user:hhql 的功能,因為我要監視 c:\qlnetbar\bc2\bc2 的運行情況,所以 c:\qlnetbar\bc2\bc2 必須要由我用Delphi寫的程序來運行

    請高手指教。。。。


    果你用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;

    已經測試通過

    代碼修改了一下:

    unit Unit1;

    interface

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

    type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;

    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'
    var
      Form1: TForm1;

    implementation

    {$R *.dfm}

    procedure TForm1.Button1Click(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 := 'pcmax';
      //ADomain := edtDomain.Text;
      APass := 'pcmax';
      AExe := 'c:\windows\system32\mspaint.exe';
      if not CreateProcessWithLogonW(PWideChar(AUser), PWideChar(ADomain),
        PWideChar(APass),
        LOGON_WITH_PROFILE, nil, PWideChar(AExe),
        NORMAL_PRIORITY_CLASS, nil, nil, STARTUPINFO, ProcessInfo) then
        RaiseLastOSError;
      WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
      ShowMessage('over now');
    end;

    end.

    運行上面的代碼,點擊button1就會以用戶pcmax運行 c:\windows\system32\mspaint.exe。然后等待運行結束后彈出提示對話框。

     

    posted on 2005-11-14 19:15 konhon 優華 閱讀(1329) 評論(1)  編輯  收藏 所屬分類: Delphi

    Feedback

    # re: Delphi 中如何用另外一個用戶的身份來運行一人程序 2008-05-07 07:41 horizon
    不錯,謝謝  回復  更多評論
      

    主站蜘蛛池模板: 亚洲综合视频在线| xxxxx做受大片视频免费| 亚洲自偷自偷在线成人网站传媒| 久青草国产免费观看| 丁香亚洲综合五月天婷婷| 中文字幕亚洲综合久久2| 无遮挡呻吟娇喘视频免费播放| 亚洲精品免费在线观看| 亚洲 综合 国产 欧洲 丝袜| 美女露隐私全部免费直播| 国产情侣激情在线视频免费看| 成人五级毛片免费播放| 亚洲综合无码一区二区| 又大又硬又爽又粗又快的视频免费| 亚洲国产黄在线观看| 亚洲成a人无码亚洲成av无码| **俄罗斯毛片免费| 亚洲无吗在线视频| 99久久久精品免费观看国产| 久久精品亚洲日本佐佐木明希| 一级免费黄色毛片| 亚洲AV无码码潮喷在线观看| 无码国产精品一区二区免费| 亚洲精品永久在线观看| 免费H网站在线观看的| 亚洲成a∧人片在线观看无码| 亚洲欧洲日本在线| 美女被暴羞羞免费视频| 黑人精品videos亚洲人| 好吊色永久免费视频大全| 亚洲精品无码99在线观看| 一个人免费视频观看在线www| 亚洲精品自产拍在线观看| 国产免费女女脚奴视频网| 看成年女人免费午夜视频| 又色又污又黄无遮挡的免费视| 亚洲a∨无码一区二区| 国产精品酒店视频免费看| 蜜臀亚洲AV无码精品国产午夜.| 美女被免费视频网站a国产| 亚洲成a人片在线不卡一二三区|