在计划任务中运行的程序如何与桌面交互(300分)

  • 主题发起人 主题发起人 michael.ma
  • 开始时间 开始时间
M

michael.ma

Unregistered / Unconfirmed
GUEST, unregistred user!
我一个程序在计划任务中以NT AUTHORITY/SYSTEM 用户运行的,窗口是看不见的,请问怎样和它通信?好像发送消息不起作用,似乎和当前用户桌面运行在不同的会话中。
这可能涉及到WindowStation ,Desktop的问题了。
 
1.用全局原子Atom
2.只要把句柄保存在某处,如文件、注册表,就能通过WM_COPYDATA传递消息
3.用TCP/IP。比如说Serv-U就是这样做的。Serv-U前台的程序和本机运行的服务,就是通过TCP/IP通讯的:)
 
ps. Serv-U的任务栏图标是 ServUTray.exe,前台管理程序是ServUAdmin.exe,任务管理器里看上去都是以当前用户名运行的
后台服务是 ServUDaemon.exe 可以在任务管理器里看到用户名是 SYSTEM 。
之间的通讯是用TCP/IP,自己连自己。我用Sniffer抓过。
甚至土一点可以轮询某个文件[:D][:D]。因为上次看VMWare的某个帮助文件,就提到类似的东西。比如某文件夹下的文件改变,触发一个事件。
总之方法多多[8D][8D]
 
其实我也知道,用socket或者不停读取一个文件的状态来判断是可以的。
发送消息好像不行阿,因为出于不同的会话。
而且我想把窗口显示出来,就是不能。
 
发广播

发送端:
procedure TForm1.Button1Click(Sender: TObject);
var uimsg:uint;
tmp:pdword;
begin
uimsg:=RegisterWindowMessage('testmsg');
caption:=inttostr(uimsg);
new(tmp);
tmp^:=BSM_APPLICATIONS;
if BroadcastSystemMessage(BSF_NOHANG or BSF_POSTMESSAGE,tmp,
uimsg,
0,0)<>-1 then begin
caption:=caption+'ok'
end else
caption:='???'
end;
接受端

unit Unit2;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
ApplicationEvents1: TApplicationEvents;
procedure FormCreate(Sender: TObject);
procedure ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
uimsg:uint;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
uimsg:=RegisterWindowMessage('testmsg');
caption:=inttostr(uimsg);
end;

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);
begin
if msg.message=uimsg then begin
CaptioN:='Send message ok';
end;
end;

end.
在WindowsXP sp1 + Delphi7.0下通过
 
我试过了RegisterWindowMessage对多用户进程也是没有用的。
不知道是不是用得不对
 
为什么不同用户的进程都可以用TerminateProcess方法结束掉,说明当前系统还是可以控制到其它用户的会话,但就是发消息就是收不到呢?
 
我已经找到解决办法了,用服务代替计划任务,虽然复杂了点,但解决问题就行了。
1.创建一个服务,必须是允许和桌面交互的服务。
2.在服务中调用要运行的程序,程序的界面是可见的。
 
接受答案了.
 
后退
顶部