2009-11-12 56 views
0

鉴于我拥有适当的权限,如何从远程获得性能数据(即“Pages/Sec”,“平均磁盘队列”等)电脑?如何使用Delphi从远程计算机获取性能数据

基本上我想编写一个函数是这样的:

function GetPerformanceData(aComputerName, aPerformanceIndicator: string): variant; 

这是最好(当然)制定出在Windows和Linux的方块。

回答

3

我不太清楚“开箱即用”的含义 - 您不想对服务器进行任何修改?另外,既然你使用Delphi,我假设客户端是Windows--服务器呢?

最简单的做法是制作一个守护进程/服务来收集服务器上的这些信息,并且客户端上的功能可以连接并读取它。服务器可以像运行在Apache中的CGI shell脚本或自定义的Delphi程序一样简单。另外请注意,您通常可以通过SSH在远程UNIX计算机上运行命令,因此您可以在远程服务器上运行诸如vm_stat之类的内容,而无需编写任何内容。 Windows有与PSEXEC工具类似的功能,你可以在这里读到它: http://technet.microsoft.com/en-us/sysinternals/bb897553.aspx

+0

+1特别是因为这是在Windows和Linux上“开箱即用”的唯一方式:远程机器应该提供数据,然后Delphi只是一个客户端。 – 2009-11-12 14:55:25

2

如果WMI (Windows Management Instrumentation)已启用,您可以使用免费的WMI component collection它可为Delphi:

MagWMI允许访问和使用Windows管理工具 更新Windows系统信息的 。 MagWMI到 提供总体视图访问使用SQL等 命令的任何WMI信息,并且还若干 专用功能与TCP/IP 配置,如设置 适配器的IP地址,并且该计算机 名和域/工作组。

+0

注意这只解决了Windows部分的问题 – 2009-11-12 14:56:01

1

看看this answer

你可以重写GetPerformanceData功能允许连接到远程注册表:

function GetPerformanceData(const RegValue: string; const ComputerName: string = ''): PPerfDataBlock; 
const 
    BufSizeInc = 4096; 
var 
    BufSize, RetVal: Cardinal; 
    Key: HKEY; 
begin 
    BufSize := BufSizeInc; 
    Result := AllocMem(BufSize); 
    try 
    if ComputerName = '' then 
     Key := HKEY_PERFORMANCE_DATA 
    else if RegConnectRegistry(PChar(ComputerName), HKEY_PERFORMANCE_DATA, Key) <> ERROR_SUCCESS then 
     RaiseLastOSError; 

    RetVal := RegQueryValueEx(Key, PChar(RegValue), nil, nil, PByte(Result), @BufSize); 
    try 
     repeat 
     case RetVal of 
      ERROR_SUCCESS: 
      Break; 
      ERROR_MORE_DATA: 
      begin 
       Inc(BufSize, BufSizeInc); 
       ReallocMem(Result, BufSize); 
       RetVal := RegQueryValueEx(Key, PChar(RegValue), nil, nil, PByte(Result), @BufSize); 
      end; 
      else 
      RaiseLastOSError; 
     end; 
     until False; 
    finally 
     RegCloseKey(Key); 
    end; 
    except 
    FreeMem(Result); 
    raise; 
    end; 
end; 

查看等功能于该单位为例如何从返回的性能数据检索特定的计数器值。请注意,他们都写在本地工作,所以你需要对其进行修改,以便能够指定计算机名称作为附加参数,例如:

function GetSystemUpTime(const ComputerName: string = ''): TDateTime; 
const 
    SecsPerDay = 60 * 60 * 24; 
var 
    Data: PPerfDataBlock; 
    Obj: PPerfObjectType; 
    Counter: PPerfCounterDefinition; 
    SecsStartup: UInt64; 
begin 
    Result := 0; 

    Data := GetPerformanceData(IntToStr(ObjSystem), ComputerName); 
    try 
    Obj := GetObjectByNameIndex(Data, ObjSystem); 
    if not Assigned(Obj) then 
     Exit; 

    Counter := GetCounterByNameIndex(Obj, CtrSystemUpTime); 
    if not Assigned(Counter) then 
     Exit; 

    SecsStartup := GetCounterValue64(Obj, Counter); 
    // subtract from snapshot time and divide by base frequency and number of seconds per day 
    // to get a TDateTime representation 
    Result := (Obj^.PerfTime.QuadPart - SecsStartup)/Obj^.PerfFreq.QuadPart/SecsPerDay; 
    finally 
    FreeMem(Data); 
    end; 
end; 

您可以得到由PERF对象和计数器索引命令lodctr /s:<filename>。 例如,'Pages/sec'计数器索引为40,属于perf对象'Memory',索引4. 还有关于如何解释原始计数器数据的外观here,具体取决于它们的定义。

+1

注意这只解决了Windows部分的问题 – 2009-11-12 14:56:41

+0

当然你是对的。我忽略了Linux的要求,对不起。 – 2009-11-12 15:23:46

相关问题