需求如下:
客户端电脑:C1,C2,C3(OS:Windows2000,Windows2003);
服务器端Server(OS:Windows2003)。
C1、C2、C3上运行PP进程的不同版本,客户端PP进程的自动更新功能被人为关闭,PP进程会向Server上传数据。要求在Server上实现一个检测程序,来监控客户端PP程序,如果不是最新版本,则发送Close消息给客户端的PP进程。
大概思路:
1.获取客户端PP进程版本信息
2.与Server最新版本信息比对
3.发送Close消息给客户端PP进程
以下是MSDN上远程获取进程信息的参考代码,不知道还有无其他可行的方法来实现,请大家帮忙,谢谢
其中
VC中的Process^的用法看不懂,求解,谢谢
C#中函数执行报异常
Process [] ipByName = Process.GetProcessesByName("notepad", "169.0.0.0");
#using <System.dll> using namespace System; using namespace System::Diagnostics; using namespace System::ComponentModel; int main() { // Get the current process. Process^ currentProcess = Process::GetCurrentProcess(); // Get all instances of Notepad running on the local // computer. array<Process^>^localByName = Process::GetProcessesByName( "notepad" ); // Get all instances of Notepad running on the specific // computer. // 1. Using the computer alias (do not precede with "\\"). array<Process^>^remoteByName = Process::GetProcessesByName( "notepad", "myComputer" ); // 2. Using an IP address to specify the machineName parameter. array<Process^>^ipByName = Process::GetProcessesByName( "notepad", "169.0.0.0" ); // Get all processes running on the local computer. array<Process^>^localAll = Process::GetProcesses(); // Get all processes running on the remote computer. array<Process^>^remoteAll = Process::GetProcesses( "myComputer" ); // Get a process on the local computer, using the process id. Process^ localById = Process::GetProcessById( 1234 ); // Get a process on a remote computer, using the process id. Process^ remoteById = Process::GetProcessById( 2345, "myComputer" ); }
using System; using System.Diagnostics; using System.ComponentModel; namespace MyProcessSample { /// <summary> /// Shell for the sample. /// </summary> class MyProcess { void BindToRunningProcesses() { // Get the current process. Process currentProcess = Process.GetCurrentProcess(); // Get all instances of Notepad running on the local // computer. Process [] localByName = Process.GetProcessesByName("notepad"); // Get all instances of Notepad running on the specifiec // computer. // 1. Using the computer alias (do not precede with "\\"). Process [] remoteByName = Process.GetProcessesByName("notepad", "myComputer"); // 2. Using an IP address to specify the machineName parameter. Process [] ipByName = Process.GetProcessesByName("notepad", "169.0.0.0"); // Get all processes running on the local computer. Process [] localAll = Process.GetProcesses(); // Get all processes running on the remote computer. Process [] remoteAll = Process.GetProcesses("myComputer"); // Get a process on the local computer, using the process id. Process localById = Process.GetProcessById(1234); // Get a process on a remote computer, using the process id. Process remoteById = Process.GetProcessById(2345, "myComputer"); } static void Main() { MyProcess myProcess = new MyProcess(); myProcess.BindToRunningProcesses(); } } }
远程获取进程信息不是难事,不过方式不是很可取,有点流氓软件的感觉。
上传数据的时候数据描述信息里携带自身版本信息就可以了,服务器进行一次验证。根据不同版本数据集特点进行处理,或者像你说的,发现不是最新版本发送close消息。
算不上流氓软件,在工厂端的工作环境。
上传的数据中并不包含程式自身的版本信息,主要是这点难办。因为旧版的程式有漏洞,客户端容易作弊,推行新版本又不能防止客户端继续使用旧版本。所以才有了在服务器端获取客户端进程版本信息的想法。
补充:客户端系统不包含.net框架,看C#的实现也是想找找思路,最好能用C++来实现。现在的客户端程式也是C++的。
@Gala:
如果一定需要着这样做,推荐你看一下远程读取注册表信息相关内容,网上很多,再有去看一下WMI。
以后完全可以预留一个消息,当然要进行加密处理,服务器发出询问客户端版本请求,客户端给予回复。
@Wang Hui:
是的,当初设计的时候考虑不全面。
谢谢您的建议