Wer einen anderen Computer über das Internet steuern möchte, muss eine Windows-Management-Instrumentation (WMI) Skriptingtypbibliothek anwenden. Damit verbindet sich der eigene Computer mit einer Remote-Adresse. Sobald sich der eigene Computer mit dem anderen verbunden hat, ist eine Bestätigung des Zielrechners Voraussetzung für den Remote-Aufbau, der nur von einem Menschen bestätigt werden kann. Nach dem Aufbau hat der Sender den kompletten Zugriff auf den Desktop des Zielrechners. Dass dafür kein Beispiel gesetzt werden kann, ist verständlich, doch der folgende Beispiele demonstriert Anwendung dieser Bibliothek.
Als Erstes muss die
Bibliothek hinzugefügt werden..
Download
Skriptingtypbibliothek
: WbemScripting_TLB
uses WbemScripting_TLB, ActiveX
//
procedure WMIRemoteShutDown(const Computer, User, password: String);
var
FLocator : ISWbemLocator;
FServices : ISWbemServices;
FObjectSet : ISWbemObjectSet;
FWMIObj : ISWbemObject;
FEnumObj : IEnumVariant;
FTmpObj : OLEVariant;
// Falls man später mit der Methode noch mehr anfangen möchte ...
// FMethod: ISWbemMethod;
FParam : ISWbemObject;
FNewObj : ISWbemObject;
FPropVal : OLEVariant;
Cnt : Cardinal;
begin
FLocator := CoSWbemLocator.CreateRemote(Computer);
try
try
if FLocator <> nil then
begin
FServices := FLocator.ConnectServer(Computer, 'root\cimv2', User,
Password, '', '', 0, nil);
if FServices <> nil then
begin
FServices.Security_.Privileges.Add(wbemPrivilegeRemoteShutdown, True);
FObjectSet :=
FServices.ExecQuery('SELECT * FROM Win32_OperatingSystem WHERE Primary=True', 'WQL', wbemFlagReturnImmediately, nil);
FEnumObj := (FobjectSet._NewEnum) as IEnumVariant;
if FEnumObj.Next(1, FTmpObj, Cnt) = S_OK then
begin
FWMIObj := IUnknown(FTmpObj) as ISWbemObject;
// die Methode kann separat ermittelt werden, wenn der Zugriff darauf benötigt wird
// FMethod := FWMIObj.Methods_.Item('Win32Shutdown', 0);
FParam := FWMIObj.Methods_.Item('Win32Shutdown', 0).InParameters;
FNewObj := FParam.SpawnInstance_(0);
FNewObj.Properties_.Add('Flags', wbemCimtypeSint32, False, 0);
// Die Flags der WMI-Methode Win32Shutdown entsprechen den Konstanten in Windows.pas
FPropVal := EWX_REBOOT;
FNewObj.Properties_.Item('Flags', 0).Set_Value(FPropVal);
FWMIObj.ExecMethod_('Win32Shutdown', FNewObj, 0, nil);
end;
end;
end;
finally
FServices := nil;
FLocator := nil;
end;
except
on e: Exception do
e.Create(e.Message);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
try
WMIRemoteShutDown(Edit1.Text, // Computer
Edit2.Text, // User Name
Edit3.Text); // Paaswort
except
on e: Exception do
ShowMessage(e.Message);
end;
end;
uses WbemScripting_TLB, ActiveX
type
TWMIOSInfo = record
OSVersionString: string;
CSDVersion: string;
OSManufacturer: string;
end;
const
WMI_SYSTEM_NAMESPACE = 'root\CIMV2';
WMI_CLASS_OS = 'Win32_OperatingSystem';
WMI_ATTRIB_OSCAPTION = 'Caption';
WMI_ATTRIB_CSDVERSION = 'CSDVersion';
WMI_ATTRIB_OSMAN = 'Manufacturer';
//
function WMIGetOSInfo(const Computer, user, Password: string): TWMIOSInfo;
var
Locator : ISWbemLocator;
Services : ISWbemServices;
ObjectDefinition: ISWbemObject;
ObjectSet : SWbemObjectSet;
ObjectInstances: IEnumVariant;
WMIObject : ISWbemObject;
PropertySet : ISWbemPropertySet;
WMIProperty : ISWbemProperty;
TempObj : OleVariant;
ObjValue : Cardinal;
begin
Locator := CoSWbemLocator.CreateRemote(Computer);
try
try
Services := Locator.ConnectServer(Computer, WMI_SYSTEM_NAMESPACE, User,
Password, '', '', 0, nil);
if Services <> nil then
begin
ObjectDefinition := Services.Get(WMI_CLASS_OS,
wbemFlagUseAmendedQualifiers, nil);
ObjectSet := ObjectDefinition.Instances_(0, nil);
ObjectInstances := (ObjectSet._NewEnum) as IEnumVariant;
if ObjectInstances.Next(1, TempObj, ObjValue) = S_OK then
begin
WMIObject := IUnknown(TempObj) as SWBemObject;
PropertySet := WMIObject.Properties_;
WMIProperty := PropertySet.Item(WMI_ATTRIB_OSCAPTION, 0);
if not VarIsNull(WMIProperty.Get_Value) then
result.OSVersionString := trim(WMIProperty.Get_Value);
WMIProperty := PropertySet.Item(WMI_ATTRIB_CSDVERSION, 0);
if not VarIsNull(WMIProperty.Get_Value) then
result.CSDVersion := trim(WMIProperty.Get_Value);
WMIProperty := PropertySet.Item(WMI_ATTRIB_OSMAN, 0);
if not VarIsNull(WMIProperty.Get_Value) then
result.OSManufacturer := trim(WMIProperty.Get_Value);
end;
end;
finally
Locator := nil;
Services := nil;
end;
except
on e: Exception do
e.Create(e.Message);
end;
end;
type
TWMICPUINFO = record
ProcessorName: string;
Speed: string;
CPUManufacturer: string;
end;
const
WMI_CLASS_CPU = 'Win32_Processor';
WMI_ATTRIB_CPUNAME = 'Name';
WMI_ATTRIB_CPUSPEED = 'CurrentClockSpeed';
WMI_ATTRIB_MAN = 'Manufacturer';
function WMIGetCPUInfo(const Computer, user, Password: string): TWMICPUInfo;
var
Locator : ISWbemLocator;
Services : ISWbemServices;
ObjectDefinition: ISWbemObject;
ObjectSet : SWbemObjectSet;
ObjectInstances: IEnumVariant;
WMIObject : ISWbemObject;
PropertySet : ISWbemPropertySet;
WMIProperty : ISWbemProperty;
TempObj : OleVariant;
ObjValue : Cardinal;
begin
Locator := CoSWbemLocator.CreateRemote(Computer);
try
try
Services := Locator.ConnectServer(Computer, WMI_SYSTEM_NAMESPACE, User,
Password, '', '', 0, nil);
if Services <> nil then
begin
ObjectDefinition := Services.Get(WMI_CLASS_CPU,
wbemFlagUseAmendedQualifiers, nil);
ObjectSet := ObjectDefinition.Instances_(0, nil);
ObjectInstances := (ObjectSet._NewEnum) as IEnumVariant;
if ObjectInstances.Next(1, TempObj, ObjValue) = S_OK then
begin
WMIObject := IUnknown(TempObj) as SWBemObject;
PropertySet := WMIObject.Properties_;
WMIProperty := PropertySet.Item(WMI_ATTRIB_CPUNAME, 0);
if not VarIsNull(WMIProperty.Get_Value) then
result.ProcessorName := trim(WMIProperty.Get_Value);
WMIProperty := PropertySet.Item(WMI_ATTRIB_CPUSPEED, 0);
if not VarIsNull(WMIProperty.Get_Value) then
result.Speed := trim(WMIProperty.Get_Value);
WMIProperty := PropertySet.Item(WMI_ATTRIB_MAN, 0);
if not VarIsNull(WMIProperty.Get_Value) then
result.CPUManufacturer := trim(WMIProperty.Get_Value);
end;
end;
finally
Locator := nil;
Services := nil;
end;
except
on e: Exception do
e.Create(e.Message);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
WMIOSInfo : TWMIOSInfo;
WMICPUInfo : TWMICPUINFO;
begin
try
WMIOSInfo := WMIGetOSInfo('', '', '');
WMICPUInfo := WMIGetCPUInfo('', '', '');
with WMIOSInfo, WMICPUInfo do
ShowMessage(OSVersionString + ' ' + CSDVersion + #13#10 +
OSManufacturer + #13#10#13#10 +
ProcessorName + #13#10 +
Speed + ' MHz' + #13#10 +
CPUManufacturer);
except
on e: Exception do
ShowMessage(e.Message);
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
FLocator : ISWbemLocator;
FServices : ISWbemServices;
FObjectSet : ISWbemObjectSet;
FWMIObj : ISWbemObject;
FEnumObj : IEnumVariant;
FTmpObj : OLEVariant;
// Falls man später mit der Methode noch mehr anfangen möchte ...
// FMethod: ISWbemMethod;
FParam : ISWbemObject;
FNewObj : ISWbemObject;
FPropVal : OLEVariant;
Cnt : Cardinal;
begin
FLocator := CoSWbemLocator.CreateRemote('hal9000');
try
if FLocator <> nil then
begin
FServices := FLocator.ConnectServer('hepu', 'root\cimv2', 'Michael2',
'xxx', '', '', 0, nil);
if FServices <> nil then
begin
FServices.Security_.Privileges.Add(wbemPrivilegeRemoteShutdown, True);
FObjectSet :=
FServices.ExecQuery('SELECT * FROM Win32_OperatingSystem WHERE Primary=True', 'WQL', wbemFlagReturnImmediately, nil);
FEnumObj := (FobjectSet._NewEnum) as IEnumVariant;
if FEnumObj.Next(1, FTmpObj, Cnt) = S_OK then
begin
FWMIObj := IUnknown(FTmpObj) as ISWbemObject;
// die Methode kann separat ermittelt werden, wenn der Zugriff darauf benötigt wird
// FMethod := FWMIObj.Methods_.Item('Win32Shutdown', 0);
FParam := FWMIObj.Methods_.Item('Win32Shutdown', 0).InParameters;
FNewObj := FParam.SpawnInstance_(0);
FNewObj.Properties_.Add('Flags', wbemCimtypeSint32, False, 0);
// Die Flags der WMI-Methode Win32Shutdown entsprechen den Konstanten in Windows.pas
FPropVal := EWX_REBOOT;
FNewObj.Properties_.Item('Flags', 0).Set_Value(FPropVal);
FWMIObj.ExecMethod_('Win32Shutdown', FNewObj, 0, nil);
end;
end;
end;
finally
FServices := nil;
FLocator := nil;
end;
end;
uses ComCtrls, ExtCtrls, WbemScripting_TLB, ActiveX
const
APPNAME = 'WMI - EnumProcesses';
type
TProcesInformation = packed record
Name: string;
Path: string;
ProcID: DWORD;
ParentProcID: DWORD;
SessionID: DWORD;
ThreadCount: DWORD;
Priority: DWORD;
end;
type
TPIArray = array of TProcesInformation;
const
WMI_HOST_COMPUTER = '.';
WMI_SYSTEM_NAMESPACE = 'root\CIMV2';
WMI_CLASS_NIC = 'Win32_Process';
WMI_ATTRIB_CAPTION = 'Name';
WMI_ATTRIB_PATH = 'ExecutablePath';
WMI_ATTRIB_PROCID = 'ProcessID';
WMI_ATTRIB_PARENT_PROCID = 'ParentProcessId';
WMI_ATTRIB_SESSIONID = 'SessionID';
WMI_ATTRIB_THREAD_CNT = 'ThreadCount';
WMI_ATTRIB_PRIORITY = 'Priority';
//
function WMIEnumProcesses(Computer, User, Password: string): TPIArray;
function GetCompName: string;
var
Buf : array[0..MAX_COMPUTERNAME_LENGTH] of Char;
Size : DWORD;
begin
Size := SizeOf(Buf);
if GetComputerName(Buf, Size) then
Result := Buf
else
Result := '';
end;
var
FComputer: String;
FUser: String;
FPassword: String;
Locator : ISWbemLocator;
Services : ISWbemServices;
ObjectDefinition: ISWbemObject;
ObjectSet : SWbemObjectSet;
ObjectInstances: IEnumVariant;
WMIObject : ISWbemObject;
PropertySet : ISWbemPropertySet;
WMIProperty : ISWbemProperty;
TempObj : OleVariant;
ObjValue : Cardinal;
i : Integer;
resourcestring
rsWMIError = 'WMI-Fehler';
begin
if AnsiUpperCase(GetCompName) = AnsiUpperCase(Computer) then
begin
FComputer := '';
FUser := '';
FPassword := '';
end
else
begin
FComputer := Computer;
FUser := user;
FPassword := Password;
end;
i := 0;
Locator := CoSWbemLocator.CreateRemote(Computer);
try
try
Services := Locator.ConnectServer(FComputer, WMI_SYSTEM_NAMESPACE,
FUser, FPassword, '', '', 0, nil);
if Services <> nil then
begin
Services.Security_.Set_ImpersonationLevel(wbemImpersonationLevelImpersonate);
Services.Security_.Privileges.Add(wbemPrivilegeDebug, True);
ObjectDefinition := Services.Get(WMI_CLASS_NIC,
wbemFlagUseAmendedQualifiers, nil);
ObjectSet := ObjectDefinition.Instances_(0, nil);
ObjectInstances := (ObjectSet._NewEnum) as IEnumVariant;
while (ObjectInstances.Next(1, TempObj, ObjValue) = S_OK) do
begin
WMIObject := IUnknown(TempObj) as SWBemObject;
PropertySet := WMIObject.Properties_;
setlength(result, length(result) + 1);
WMIProperty := PropertySet.Item(WMI_ATTRIB_CAPTION, 0);
if not VarIsNull(WMIProperty.Get_Value) then
result[i].Name := WMIProperty.Get_Value;
WMIProperty := PropertySet.Item(WMI_ATTRIB_PATH, 0);
if not VarIsNull(WMIProperty.Get_Value) then
result[i].Path := WMIProperty.Get_Value;
WMIProperty := PropertySet.Item(WMI_ATTRIB_PROCID, 0);
if not VarIsNull(WMIProperty.Get_Value) then
result[i].ProcID := WMIProperty.Get_Value;
WMIProperty := PropertySet.Item(WMI_ATTRIB_PARENT_PROCID, 0);
if not VarIsNull(WMIProperty.Get_Value) then
result[i].ParentProcID := WMIProperty.Get_Value;
WMIProperty := PropertySet.Item(WMI_ATTRIB_SESSIONID, 0);
if not VarIsNull(WMIProperty.Get_Value) then
result[i].SessionID := WMIProperty.Get_Value;
WMIProperty := PropertySet.Item(WMI_ATTRIB_THREAD_CNT, 0);
if not VarIsNull(WMIProperty.Get_Value) then
result[i].ThreadCount := WMIProperty.Get_Value;
WMIProperty := PropertySet.Item(WMI_ATTRIB_PRIORITY, 0);
if not VarIsNull(WMIProperty.Get_Value) then
result[i].Priority := WMIProperty.Get_Value;
Inc(i);
end;
end;
finally
Locator := nil;
Services := nil;
end;
except
on e: Exception do
raise e.Create(e.message);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
PIArray : TPIArray;
i : Integer;
NewItem : TListItem;
resourcestring
rsPorcsCnt = 'Prozesse: %d';
begin
PIArray := nil;
Listview1.Items.Clear;
try
PIArray := WMIEnumProcesses(Edit1.Text,
Edit2.Text,
Edit3.Text);
Listview1.Items.BeginUpdate;
for i := 0 to length(PIArray) - 1 do
begin
NewItem := Listview1.Items.Add;
NewItem.Caption := PIArray[i].Name;
NewItem.SubItems.Add(PIArray[i].Path);
NewItem.SubItems.Add(IntToStr(PIArray[i].ProcID));
NewItem.SubItems.Add(IntToStr(PIArray[i].ParentProcID));
NewItem.SubItems.Add(IntToStr(PIArray[i].SessionID));
NewItem.SubItems.Add(IntToStr(PIArray[i].ThreadCount));
NewItem.SubItems.Add(IntToStr(PIArray[i].Priority));
end;
Listview1.Items.EndUpdate;
Statusbar1.SimpleText := Format(rsPorcsCnt, [length(PIArray)]);
except
on e: Exception do
begin
NewItem := Listview1.Items.Add;
NewItem.Caption := e.Message;
end;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Caption := APPNAME;
Application.Title := APPNAME;
end;
Keine Kommentare:
Kommentar veröffentlichen