Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Betriebssystem-Informationen von Remoterechner (https://www.delphipraxis.net/96078-betriebssystem-informationen-von-remoterechner.html)

Luckie 18. Jul 2007 11:11


Betriebssystem-Informationen von Remoterechner
 
Ich brauche genauere Informationen über die Betriebssystemversion eines Rechners im Netzwerk.

Versuch 1 mit NetWkstaGetInfo:
Funktionier gut. Aber die Informationen reichen nicht, da ich auch Windows XP Home von Windows XP Professioanl unterscheiden können muss. NetWkstaGetInfo liefert aber nur die Major und Minor Version.

Versuch 2 mit WMI:
Delphi-Quellcode:
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;
Da mit bekomme ich, wenn ich auf einen XP Home Rechner zugreife, den Fehler "Zugriff verweigert". Könnte das mal jemand bitte bei sich ausprobieren, nicht dass es nur hier am Netzwerk liegt und es eigentlich funktioniert.

Ich bin für weiter Vorschläge offen. Ausscheiden tut aber: Remote-Regitry-Access, da genau dies nicht geht unter XP Home und eine Client-Server-Lösung.

Alter Mann 18. Jul 2007 18:47

Re: Betriebssystem-Informationen von Remoterechner
 
Hi Lukie,

du öffnest die Verbindung so:
Delphi-Quellcode:
  Locator := CoSWbemLocator.CreateRemote(Computer);
  try
    try
      Services := Locator.ConnectServer(Computer, WMI_SYSTEM_NAMESPACE, User,
        Password, '', '', 0, nil);
würde es so nicht reichen?
Delphi-Quellcode:
  Locator := CoSWbemLocator.Create;
  Services:= Locator.ConnectServer(Computer,
                                   WMI_SYSTEM_NAMESPACE,
                                   User,
                                   Password,
                                   '',
                                   '',
                                   wbemConnectFlagUseMaxWait,
                                   nil);
Und denke daran wbemConnectFlagUseMaxWait hat den Wert 128 wenn das OS > W2K ist.

Gruß

Luckie 18. Jul 2007 21:49

Re: Betriebssystem-Informationen von Remoterechner
 
Das ändert leider auch nichts. :(

Christian Seehase 18. Jul 2007 21:55

Re: Betriebssystem-Informationen von Remoterechner
 
Moin Michael,

XP Home kenne ich jetzt auch nicht näher, und könnte es zur Zeit auch nicht prüfen, aber bist Du sicher, das die Angabe von User und Passwort für den angesprochenen Rechner korrekt sind?
Wenn es sich um einen lokalen User auf dem XP-Home rechner handelt, müsstest Du als Usernamen Rechnername\Username angeben.

Luckie 18. Jul 2007 21:59

Re: Betriebssystem-Informationen von Remoterechner
 
Die sind korrekt. Hm, das könnte ich mal probieren.

Ich habe es jetzt so:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  WMIOSInfo   : TWMIOSInfo;
  WMICPUInfo  : TWMICPUINFO;
begin
  try
    WMIOSInfo := WMIGetOSInfo('\\hepu', 'hepu\Michael', 'micky');
    WMICPUInfo := WMIGetCPUInfo('\\hepu', 'hepu\Michael', 'micky');
    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;
Aber da bekomme ich auch eine Exception "Zugriff verweigert" in der WbemScripting_TLB an der Stelle:
Delphi-Quellcode:
class function CoSWbemLocator.CreateRemote(const MachineName: string): ISWbemLocator;
begin
  Result := CreateRemoteComObject(MachineName, CLASS_SWbemLocator) as ISWbemLocator;
end;

Christian Seehase 18. Jul 2007 22:18

Re: Betriebssystem-Informationen von Remoterechner
 
Moin Michael,

hast Du mal so versucht Dich mit dem Rechner, unter Verwendung des angegebenen Accounts zu verbinden?

Luckie 18. Jul 2007 22:41

Re: Betriebssystem-Informationen von Remoterechner
 
Hm, wenn ich versuche über die Netzwerkumgebung auf ihn zu zugreifen kommt das:
Zitat:

Auf \\Hepu kann nicht zugegriffen werden. Sie haben eventuell keine Berechtigung, diese Netzwerkressource zu verwenden. Wenden Sie sich an den Administrator des Servers, um herauszufinden, ob Sie über Berechtigungen verfügen.

Der Netzwerkpfad wurde nicht gefunden.
Aber eine Freigabe kann ich erzeugen. Mit meinem Usermanager bekomme ich ja zumindest die Benutzer aufgelistet.

WS1976 19. Jul 2007 06:16

Re: Betriebssystem-Informationen von Remoterechner
 
Hallo Luckie,

selbst auf die Gefahr hin, dass ich mit dir anlege:
wenn man von anderen Information will oder auch Tests, dann sollte man schon darauf achten, dass
das Codebeispiel auch läuft.
Dein Uses - Kopf ist unvollständig:
Korrekt:
Delphi-Quellcode:
uses
  WbemScripting_TLB, ActiveX, Variants, sysutils;
Ich habe keine Lust auch noch suchen zu müssen, wenn ich jemanden zu helfen versuche.

Grüsse
Rainer

Luckie 19. Jul 2007 10:16

Re: Betriebssystem-Informationen von Remoterechner
 
Stimmt, du hast recht, das war etwas ungeschickt von mir. Da hatte ich wohl was vergessen mit aus dem Testprojekt rauszukopieren. Danke für den Hinweis.

Alter Mann 19. Jul 2007 14:01

Re: Betriebssystem-Informationen von Remoterechner
 
Hallo,

lokaler Computer? Der heißt bei WMI ='.'!
So'ne Kombination wie '\\Computername\Username' gibt es so nicht, die 'baut' sich ConnectServer selber zusammen.

Gruß


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:58 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz