2009-11-12 55 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

相關問題