概要
Python(pywin32)でWindows Management Instrumentation(WMI)を使ってレジストリの情報を取得します。
次回、コードで利用しているオブジェクトの説明(もう少し具体的なクラス図かシーケンス図か)を入れる予定。
注
ネットにPython(pywin32) + WMIの情報が少なく、嵌りも多いので、普通に使うにはなかなかおすすめできない です。現時点では。
とか他の方法をおすすめします。
レジストリについて
レジストリの概要は以下の記事がまとまっています。
※レジストリハイブはデフォルトだと見えないファイルです。参考
-
第5回システム設定を集中管理するレジストリ:Windows OS入門 - @IT
- キーワード:ルートキー、サブキー、レジストリハイブ、値(名前、型、データ)
以下は必要に応じてどうぞ。
-
第6回レジストリのリダイレクトと仮想化およびレジストリ操作ツール:Windows OS入門 - @IT
- キーワード:32bit/64bitの違い、リダイレクト、リフレクション(廃止)、仮想化
-
Inside the Registry - technet.microsoft.com
- キーワード:Hive Structure, Volatile hive, Stable Storage
-
Where are the Windows registry files located in Windows 10_8_7-The Windows Club
- キーワード:Volatile hive, hivelist
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の値のデータを取得します。
# -*- 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の値の名前と種類(型)を列挙します。
# -*- 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
値の名前、型、データを列挙する
データも合わせてとってきてみます。
# -*- 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
参考
- WMI Scripting Primer Part 1 Microsoft Docs
- WMI Providers - Microsoft Docs
- StdRegProv class
- Scripting API Objects Microsoft Docs
- WMI Step - WMI Fun!!
- WMI Library - WMI Fun!!
- Insider's Eye:GUIを超えて進化するWindows管理ツール(1)- @IT
- WMI - マイクロソフト系技術情報 Wiki
- JScriptでWMI(その1) - Qiita
- WshShell オブジェクト - msdn
- jscriptから WMIを使ってレジストリキー_値列挙 - あぁ そうだった
- Windows Management Instrumentation - Microsoft Docs
- winreg でレジストリを読み書きするサンプルコード - かせきのうさぎさん
- 2. システムファイルを表示する方法 - 121ware.com
- 第5回 システム設定を集中管理するレジストリ:Windows OS入門 - @IT
- Where are the Windows registry files located in Windows 10_8_7-The Windows Club
- Inside the Registry - technet.microsoft.com
- PythonからリモートPCの色んな情報を抜いてみた by WMI Library - Qiita