LoginSignup
4
2

More than 5 years have passed since last update.

Python(pywin32) + WMI でレジストリを読む

Last updated at Posted at 2018-07-06

概要

Python(pywin32)でWindows Management Instrumentation(WMI)を使ってレジストリの情報を取得します。

次回、コードで利用しているオブジェクトの説明(もう少し具体的なクラス図かシーケンス図か)を入れる予定。

ネットにPython(pywin32) + WMIの情報が少なく、嵌りも多いので、普通に使うにはなかなかおすすめできない です。現時点では。

とか他の方法をおすすめします。

レジストリについて

レジストリの概要は以下の記事がまとまっています。
※レジストリハイブはデフォルトだと見えないファイルです。参考

以下は必要に応じてどうぞ。

WMIについて

全体像を把握するのは以下の記事がいいです。
※ 特に、「WMIアーキテクチャ」の図の周辺

↑を読んだあと、↓を掻い摘んでよむのがいいかと。
WMI Scripting Primer Part 1 Microsoft Docs
WMI Providers Microsoft Docs
Scripting API Objects Microsoft Docs

コード

値を取得する

HKEY_CURRENT_USER\Software\7-ZipのPath64の値のデータを取得します。

image.png

# -*- coding: utf-8 -*-
import win32com.client

HKEY_CLASSES_ROOT = 2147483648
HKEY_CURRENT_USER = 2147483649
HKEY_LOCAL_MACHINE = 2147483650
HKEY_USERS = 2147483651
HKEY_CURRENT_CONFIG = 2147483653

SWbemLocator=win32com.client.Dispatch(r"WbemScripting.SWbemLocator")
SWbemServices=SWbemLocator.ConnectServer(".", r"root\default")
StdRegProv=SWbemServices.Get("StdRegProv")
in_param=StdRegProv.Methods_("GetStringValue").InParameters.SpawnInstance_()
in_param.hDefKey=HKEY_CURRENT_USER
in_param.sSubKeyName = r"SOFTWARE\7-Zip"
in_param.sValueName = "Path64"
ret=SWbemServices.ExecMethod("StdRegProv", "GetStringValue", in_param)

print(ret.GetObjectText_())
print(ret.sValue)

出力

instance of __PARAMETERS
{
        ReturnValue = 0;
        sValue = "C:\\Program Files\\7-Zip\\";
};

C:\Program Files\7-Zip\

値の名前と型を列挙する

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorerの値の名前と種類(型)を列挙します。

image.png

# -*- coding: utf-8 -*-
import win32com.client

HKEY_CLASSES_ROOT = 2147483648
HKEY_CURRENT_USER = 2147483649
HKEY_LOCAL_MACHINE = 2147483650
HKEY_USERS = 2147483651
HKEY_CURRENT_CONFIG = 2147483653

import win32com.client
SWbemLocator=win32com.client.Dispatch(r"WbemScripting.SWbemLocator")
SWbemServices=SWbemLocator.ConnectServer(".", r"root\default")
StdRegProv=SWbemServices.Get("StdRegProv")
in_param=StdRegProv.Methods_("EnumValues").InParameters.SpawnInstance_()
in_param.hDefKey=HKEY_CURRENT_USER
in_param.sSubKeyName = r"Software\Microsoft\Windows\CurrentVersion\Explorer"
SWbemObject=SWbemServices.ExecMethod("StdRegProv", "EnumValues", in_param)
print(SWbemObject.GetObjectText_())

# EnumValues method of the StdRegProv class
# https://msdn.microsoft.com/en-us/library/aa390388
# Types [out]参照

reg_types= {
    "REG_SZ":1,
    "REG_EXPAND_SZ":2,
    "REG_BINARY":3,
    "REG_DWORD":4,
    "REG_MULTI_SZ":7,
    "REG_QWORD":11
}

print("値の名前:値の型")
for n,t in zip(SWbemObject.sNames, SWbemObject.Types):
    print(f"{n}:{list(reg_types.keys())[list(reg_types.values()).index(t)]}")

出力

instance of __PARAMETERS
{
        ReturnValue = 0;
        sNames = {"ShellState", "ExplorerStartupTraceRecorded", "UserSignedIn", "SlowContextMenuEntries", "TelemetrySalt", "SIDUpdatedOnLibraries", "LocalKnownFoldersMigrated", "GlobalAssocChangedCounter", "FirstRunTelemetryComplete", "AppReadinessLogonComplete", "EdgeDesktopShortcutCreated", "PostAppInstallTasksCompleted", "link"};
        Types = {3, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 4, 3};
};

値の名前:値の型
ShellState:REG_BINARY
ExplorerStartupTraceRecorded:REG_DWORD
UserSignedIn:REG_DWORD
SlowContextMenuEntries:REG_BINARY
TelemetrySalt:REG_DWORD
SIDUpdatedOnLibraries:REG_DWORD
LocalKnownFoldersMigrated:REG_DWORD
GlobalAssocChangedCounter:REG_DWORD
FirstRunTelemetryComplete:REG_DWORD
AppReadinessLogonComplete:REG_DWORD
EdgeDesktopShortcutCreated:REG_DWORD
PostAppInstallTasksCompleted:REG_DWORD
link:REG_BINARY

値の名前、型、データを列挙する

データも合わせてとってきてみます。

image.png

# -*- coding: utf-8 -*-
HKEY_CLASSES_ROOT = 2147483648
HKEY_CURRENT_USER = 2147483649
HKEY_LOCAL_MACHINE = 2147483650
HKEY_USERS = 2147483651
HKEY_CURRENT_CONFIG = 2147483653

import win32com.client
SWbemLocator=win32com.client.Dispatch(r"WbemScripting.SWbemLocator")
SWbemServices=SWbemLocator.ConnectServer(".", r"root\default")
StdRegProv=SWbemServices.Get("StdRegProv")
in_param=StdRegProv.Methods_("EnumValues").InParameters.SpawnInstance_()
in_param.hDefKey=HKEY_CURRENT_USER
in_param.sSubKeyName = r"Software\Microsoft\Windows\CurrentVersion\Explorer"
EnumValues_SWbemObject=SWbemServices.ExecMethod("StdRegProv", "EnumValues", in_param)

# EnumValues method of the StdRegProv class
# https://msdn.microsoft.com/en-us/library/aa390388
# Types [out]参照

reg_types= {
    "REG_SZ":1,
    "REG_EXPAND_SZ":2,
    "REG_BINARY":3,
    "REG_DWORD":4,
    "REG_MULTI_SZ":7,
    "REG_QWORD":11
}

# 値の名前、型からデータを取得して文字列で返す
def get_value_data_str(value_name,value_type, StdRegProv):
    if value_type == "REG_BINARY":
        method = "GetBinaryValue"
    elif value_type == "REG_DWORD":
        method = "GetDWORDValue"
    else:
        return "None"

    in_param=StdRegProv.Methods_(method).InParameters.SpawnInstance_()
    in_param.hDefKey=HKEY_CURRENT_USER
    in_param.sSubKeyName = r"Software\Microsoft\Windows\CurrentVersion\Explorer"
    in_param.sValueName = value_name
    SWbemObject=SWbemServices.ExecMethod("StdRegProv", method, in_param)

    if value_type == "REG_BINARY":
        return " ".join(map(lambda v:format(v, '02x'), SWbemObject.uValue))
    else:
        return "0x"+format(SWbemObject.uValue, '08x')

print("値の名前:値の型:値のデータ")
for ValueName,ValueType in zip(EnumValues_SWbemObject.sNames, EnumValues_SWbemObject.Types):
    ValueTypeStr = list(reg_types.keys())[list(reg_types.values()).index(ValueType)]
    print(f"{ValueName}:{ValueTypeStr}:{get_value_data_str(ValueName,ValueTypeStr,StdRegProv)}")

出力

値の名前:値の型:値のデータ
ShellState:REG_BINARY:24 00 00 00 34 28 00 00 
ExplorerStartupTraceRecorded:REG_DWORD:0x00000001
UserSignedIn:REG_DWORD:0x00000001
SlowContextMenuEntries:REG_BINARY:4f 54 ec 56 00 
TelemetrySalt:REG_DWORD:0x00000006
SIDUpdatedOnLibraries:REG_DWORD:0x00000001
LocalKnownFoldersMigrated:REG_DWORD:0x00000001
GlobalAssocChangedCounter:REG_DWORD:0x00000058
FirstRunTelemetryComplete:REG_DWORD:0x00000001
AppReadinessLogonComplete:REG_DWORD:0x00000001
EdgeDesktopShortcutCreated:REG_DWORD:0x00000001
PostAppInstallTasksCompleted:REG_DWORD:0x00000001
link:REG_BINARY:16 00 00 00

備考

レジストリをreg.exeでやってテキスト処理に持ち込む

HKEY_LOCAL_MACHINE\Software\Classesのキーを列挙する場合・・・

In [251]: reg_query=subprocess.run(["reg", "query", r"HKEY_LOCAL_MACHINE\Software\Classes"], stdout=subprocess.PIPE)

In [252]: for s in reg_query.stdout.decode('cp932').split():
     ...:     m=re.search(r".*Excel.Application$",s)
     ...:     if m:
     ...:         print(m.group())
HKEY_LOCAL_MACHINE\Software\Classes\Excel.Application

参考

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2