this slowpoke moves

WMI Remote Desktop

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

Beispiel Remote Shutdown:

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;



Beispiel System Informationen & RPC:

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;



Beispiel Prozesse in einer ListView:


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

Beliebte Posts

Translate