Как получить данные о производительности с удаленного компьютера с помощью Delphi - PullRequest
0 голосов
/ 12 ноября 2009

Учитывая, что у меня есть соответствующие права, как я могу получить данные о производительности (т. Е. «Pages / Sec», «Avg. Disk Queue» и так далее) с удаленного компьютера?

В основном я хочу написать такую ​​функцию:

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

Желательно (конечно) работать из коробки на Windows и Linux.

Ответы [ 3 ]

3 голосов
/ 12 ноября 2009

Я не совсем уверен, что вы подразумеваете под «из коробки» - вы не хотите вносить какие-либо изменения в сервер? Кроме того, поскольку вы используете Delphi, я предполагаю, что клиент - это Windows - как насчет сервера?

Самое простое, что можно сделать, - создать демон / службу, которая собирает эту информацию на сервере, а функция на клиенте может подключиться и прочитать ее. Сервер может быть чем-то простым, например, сценарий оболочки CGI, работающий в apache, или пользовательская программа Delphi. Также обратите внимание, что вы обычно можете запускать команды на удаленных Unix-машинах по SSH, поэтому вы можете запускать что-то вроде vm_stat на удаленном сервере, ничего не записывая. Windows имеет аналогичную функциональность с инструментом PsExec, вы можете прочитать об этом здесь: http://technet.microsoft.com/en-us/sysinternals/bb897553.aspx

2 голосов
/ 12 ноября 2009

Если WMI (инструментарий управления Windows) включен, вы можете использовать бесплатную коллекцию компонентов WMI , которая доступна для Delphi:

MagWMI, который позволяет получить доступ и обновить системной информации Windows с использованием Инструментарий управления Windows. MagWMI обеспечивает общий вид доступа к любая информация WMI с использованием SQL, как команды, а также ряд выделенная функция, относящаяся к TCP / IP Конфигурация, такая как настройка адаптер IP-адреса и компьютер имя и домен / рабочая группа.

1 голос
/ 12 ноября 2009

Посмотрите на этот ответ .

Вы можете переписать функцию 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>. Например, индекс счетчика «Страниц / сек» равен 40 и принадлежит перфекту «Память», индекс 4. Также посмотрите здесь о том, как интерпретировать необработанные данные счетчика, в зависимости от их определения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...