Mehr Infos mit NetWkstaGetInfo



  • Ich brauche Betriebssysteminformationen von einem Remoterechner. Dazu nutze ich die API-Funktion NetWkstaGetInfo. Damit bekomme ich aber leider nur die Major- und Minor-Versionsnummer. Das reicht aber leider nicht aus, um zum Beispiele zwischen Windows XP Professional und Windows XP Home zu unterscheiden. Es wäre für mein Programm aber ziemlich wichtig zu wissen, ob auf dem Remoterechner XP Home oder XP Professional läuft. Und ich meine, ich hätte schon Programme gesehen, die das können.

    Oder gibt es eine andere möglicheit das Betriebssystem eines Remoterehners zu ermitteln, ohne dass dort ein Client läuft, der einem die gewünschten Informationen zurückschickt?



  • z.B. mittels
    - WMI
    oder
    - Remote-Registry-Access



  • WMI wäre eine Möglichkeit, daran habe ich noch gar nicht gedacht. Aber Remote-Registry-Access geht nicht, da XP Home keinen Remotezugriff der Registry zu lässt. Genau deswegen muss ich ja wissen, ob es Home oder Professinal ist, weil ich Zugriff auf die Registry brauche. 😉 Aber zu sagen "kein Zugriff, ergo Home" ist auch nicht sicher. Aber mit WMI werde ich es mal testen. Danke für den Tipp.



  • Per WMI...

    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;
    

    ...bekomme ich leider den Fehler "Zugriff verweigert".


Anmelden zum Antworten