Making a PING with Delphi and the WMI
總算找到一個可以以一般使用者權限 ping 網路設備的方法了。
適用 XP 環境, Delphi 7 以上開發,也就是說在 Win7, Delphi2009 以上也可以開發。
在 Form 放 1 個 TEdit 和 1 個 Button
unit Unit1;
interface
// 注意要 uses ActiveX, ComObj
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ActiveX, ComObj;
type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function GetStatusCodeStr(statusCode:integer) : string;
begin
case statusCode of
0 : Result := 'Success';
11001: Result := 'Buffer Too Small';
11002: Result := 'Destination Net Unreachable';
11003: Result := 'Destination Host Unreachable';
11004: Result := 'Destination Protocol Unreachable';
11005: Result := 'Destination Port Unreachable';
11006: Result := 'No Resources';
11007: Result := 'Bad Option';
11008: Result := 'Hardware Error';
11009: Result := 'Packet Too Big';
11010: Result := 'Request Timed Out';
11011: Result := 'Bad Request';
11012: Result := 'Bad Route';
11013: Result := 'TimeToLive Expired Transit';
11014: Result := 'TimeToLive Expired Reassembly';
11015: Result := 'Parameter Problem';
11016: Result := 'Source Quench';
11017: Result := 'Option Too Big';
11018: Result := 'Bad Destination';
11032: Result := 'Negotiating IPSEC';
11050: Result := 'General Failure'
else
result := 'Unknow';
end;
end;
function Ping(const Address:string; BufferSize:Word): string;
var
FSWbemLocator : OLEVariant;
FWMIService : OLEVariant;
FWbemObjectSet: OLEVariant;
FWbemObject : OLEVariant;
oEnum : IEnumvariant;
iValue : LongWord;
PacketsReceived : Integer;
Minimum : Integer;
Maximum : Integer;
Average : Integer;
begin
PacketsReceived := 0;
Minimum := 0;
Maximum := 0;
Average := 0;
FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
FWMIService := FSWbemLocator.ConnectServer('localhost', 'root\CIMV2', '', '');
FWbemObjectSet:= FWMIService.ExecQuery(Format('SELECT * FROM Win32_PingStatus where Address=%s AND BufferSize=%d',[QuotedStr(Address),BufferSize]),'WQL',0);
oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
if (oEnum.Next(1,FWbemObject,iValue)=0) then
begin
if FWbemObject.StatusCode=0 then
begin
// ping 成功
Inc(PacketsReceived);
result := 'ping 的到';
end
else
if not VarIsNull(FWbemObject.StatusCode) then
result := GetStatusCodeStr(FWbemObject.StatusCode)
else
result := 'Error processing request';
end;
FWbemObject := Unassigned;
FWbemObjectSet := Unassigned;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
str: string;
begin
try
CoInitialize(nil);
try
str := Ping(Edit1.Text, 32);
showmessage(str);
finally
CoUninitialize;
end;
except
on E:Exception do
showmessage('意外錯誤: ' + E.Classname + ':' + E.Message);
end;
end;
end.
相關筆記 ----
【Delphi】以 Indy TIdIcmpClient 去 ping 網路設備
【Delphi】以 icmp.dll 去 ping 網路設備
很實用,謝謝分享!
回覆刪除