![]() |
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:
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.
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; 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. |
Re: Betriebssystem-Informationen von Remoterechner
Hi Lukie,
du öffnest die Verbindung so:
Delphi-Quellcode:
würde es so nicht reichen?
Locator := CoSWbemLocator.CreateRemote(Computer);
try try Services := Locator.ConnectServer(Computer, WMI_SYSTEM_NAMESPACE, User, Password, '', '', 0, nil);
Delphi-Quellcode:
Und denke daran wbemConnectFlagUseMaxWait hat den Wert 128 wenn das OS > W2K ist.
Locator := CoSWbemLocator.Create;
Services:= Locator.ConnectServer(Computer, WMI_SYSTEM_NAMESPACE, User, Password, '', '', wbemConnectFlagUseMaxWait, nil); Gruß |
Re: Betriebssystem-Informationen von Remoterechner
Das ändert leider auch nichts. :(
|
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. |
Re: Betriebssystem-Informationen von Remoterechner
Die sind korrekt. Hm, das könnte ich mal probieren.
Ich habe es jetzt so:
Delphi-Quellcode:
Aber da bekomme ich auch eine Exception "Zugriff verweigert" in der WbemScripting_TLB an der Stelle:
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;
Delphi-Quellcode:
class function CoSWbemLocator.CreateRemote(const MachineName: string): ISWbemLocator;
begin Result := CreateRemoteComObject(MachineName, CLASS_SWbemLocator) as ISWbemLocator; end; |
Re: Betriebssystem-Informationen von Remoterechner
Moin Michael,
hast Du mal so versucht Dich mit dem Rechner, unter Verwendung des angegebenen Accounts zu verbinden? |
Re: Betriebssystem-Informationen von Remoterechner
Hm, wenn ich versuche über die Netzwerkumgebung auf ihn zu zugreifen kommt das:
Zitat:
|
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:
Ich habe keine Lust auch noch suchen zu müssen, wenn ich jemanden zu helfen versuche.
uses
WbemScripting_TLB, ActiveX, Variants, sysutils; Grüsse Rainer |
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.
|
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 13:37 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz