OSの種類を取得

WMIでOSの種類を特定する方法を説明する。

基本的な考え方

WMIのWin32_OperatingSystemを使うと、OSの大まかな種別、バージョン、ビット幅、サービスパック、製品名などを得ることができる。 Captionプロパティを見れば、ビット数とサービスパック以外の情報は得られるのだが、Captionには明確な規則性があるわけ ではないので、判定にはやや使いにくい。

バージョンだけでも、完全な判別はできない。

OSTypeで、Win95, Win98, WinNT系かを判別できる。WinNT系内での細かい判別は、Versionプロパティを使う。 ただ、Versionプロパティだけでは、Windows VISTAとWindows 2008 Serverの区別ができない。 また、Windows 7とWindows 2008 Server R2の区別ができない。

これらの区別はCaptionプロパティを使わざるを得ない。

bit幅はOSArchitectureを使えばいいのだが、WindowsXP 32bitはこのプロパティを持ってない。試したことは無いのだが、64bit版XPは このプロパティを持っているらしい。

ServicePackは、CSDVersionプロパティを使えばいい。

Win32_OperatingSystemを使ったOSの判定クラス

OSの種類を判定するクラスを作ってみた。 エディションはCaptionを見ればわかる。

  require 'win32ole'
  
  class WindowsJudge
    def initialize
      @mgres_os = get_mgres_os()
    end
  
    # [OS_SeriesName, BIT_Width, ServicePack, Caption]
    def get_osinfo
      os_series_name = get_os_serisename()
      os_bitwidth = get_os_bitwidth()
      service_pack = get_service_pack()
      caption = @mgres_os.Caption
      return [os_series_name, os_bitwidth, service_pack, caption]
    end
  
    private
    def get_mgres_os()
      wmi = WIN32OLE.connect('winmgmts://')
      mgres_os_col = wmi.InstancesOf("Win32_OperatingSystem")
      mgres_os_col.each {|mgres_os|
        return mgres_os
      }
      nil  # ここには来ない
    end
  
    TYP_WIN95 = "Win95"
    TYP_WIN98 = "Win98"
    TYP_WINNT4 = "WinNT4.0"
    TYP_WIN2K = "Win2K"
    TYP_WINXP = "WinXP"
    TYP_2003SVR = "Win2003Server"
    TYP_VISTA = "Vista"
    TYP_2008SVR = "Win2008Server"
    TYP_WIN7 = "Win7"
    TYP_2008SVR_R2 = "Win2008ServerR2"
    TYP_UNKNOWN = ""
    def get_os_serisename()
      case @mgres_os.OSType
      when 16
        return TYP_WIN95
      when 17
        return TYP_WIN98
      when 18
        # WindowsNT系
        os_series = get_os_serisename_WINNT()
        return os_series
      else
        return TYP_UNKNOWN
      end
    end
  
    def get_os_serisename_WINNT()
      case @mgres_os.Version
      when /^4.0/
        return TYP_WINNT4
      when /^5.0/
        return TYP_WIN2K
      when /^5.1/
        return TYP_WINXP
      when /^5.2/
        return TYP_2003SVR
      when /^6.0/
        # Vistaか2008 Server
        if @mgres_os.Caption =~ /Vista/
          return TYP_VISTA
        else
          return TYP_2008SVR
        end
      when /^6.1/
        # Win7か2008 Server R2
        if @mgres_os.Caption =~ /Windows 7/
          return TYP_WIN7
        else
          return TYP_2008SVR_R2
        end
      else
        return TYP_UNKNOWN
      end
  
    end
  
    BITWIDTH_16 = "16bit"
    BITWIDTH_32 = "32bit"
    BITWIDTH_64 = "64bit"
    BITWIDTH_UNKNOWN = ""
    def get_os_bitwidth()
      case @mgres_os.OSType
      when 16, 17
        return BITWIDTH_16
      when 18
        # WindowsNT系
        begin
          os_arch = @mgres_os.OSArchitecture
          if os_arch =~ /64/
            return BITWIDTH_64
          else
            return BITWIDTH_32
          end
        rescue
          # 32bit WinXPにはOSArchitectureというメソッドが無い
          return BITWIDTH_32
        end
      else
        return BITWIDTH_UNKNOWN
      end
    end
  
    def get_service_pack()
      begin
        sp_version = @mgres_os.CSDVersion
        if sp_version =~ /Service Pack (\d+)/i
          return "SP#{$1}"
        else
          return ""
        end
      rescue
        return ""
      end
    end
  end
  
  if $0 == __FILE__
    judge =  WindowsJudge.new
  
    os_series, bit_width, sp, caption = judge.get_osinfo()
    p [os_series, bit_width, sp, caption]
  end  
  


戻る