delphi oracle新建用户,Delphi 中如何用另外一个用户的身份来运行一人程序

如一个程序要有以下的命令来运行

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。然后等待运行结束后弹出提示对话框。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值