我尝试了以下内容:
$obj = new-object -ComObject Wscript.Shell
$obj | gm
输出:
TypeName: System.__ComObject#{41904400-be18-11d3-a28b-00104bd35090}
Name MemberType Definition
---- ---------- ----------
AppActivate Method bool AppActivate (Variant, Variant)
CreateShortcut Method IDispatch CreateShortcut (string)
Exec Method IWshExec Exec (string)
ExpandEnvironmentStrings Method string ExpandEnvironmentStrings (string)
LogEvent Method bool LogEvent (Variant, string, string)
Popup Method int Popup (string, Variant, Variant, Variant)
RegDelete Method void RegDelete (string)
RegRead Method Variant RegRead (string)
RegWrite Method void RegWrite (string, Variant, Variant)
Run Method int Run (string, Variant, Variant)
SendKeys Method void SendKeys (string, Variant)
Environment ParameterizedProperty IWshEnvironment Environment (Variant) {get}
CurrentDirectory Property string CurrentDirectory () {get} {set}
SpecialFolders Property IWshCollection SpecialFolders () {get}
如果是这种情况,那么您应该得到以下结果:
get-wmiobject Win32_ComClass | Where {$_.ComponentId -eq "{41904400-be18-11d3-a28b-00104bd35090}" }
然而,我没有!我在找正确的地方吗?
答案 0 :(得分:1)
在这种情况下我不会使用WMI。只需在注册表中直接查找ProgId(Wscript.Shell
):
HKCR\ProgId
如果该密钥具有子密钥CLSID
1 ,那么其默认值就是您要查找的内容。
有很多情况需要做更多的工作。例如。 :版本无关的ProgId没有“CLSID”子键,但带有“CurVer”子键和另一个要查找的ProgId。
还有一些情况,HKCU(又名HKEY_CLASSES_ROOT)的子键不代表可以直接实例化的COM类,这些子类没有“CLSID”子键。
这样的事情应该有效(记住HKCR:
是HKLM:\SOFTWARE\Classes
的别名)
function getClsid {
param(
[string]$progId
)
if (Test-Path "HKLM:\SOFTWARE\Classes\$progId\CLSID") {
(Get-ItemProperty "HKLM:\SOFTWARE\Classes\$progId\CLSID").{(default)}
} elseif (Test-Path "HKLM:\SOFTWARE\Classes\$progId\CurVer") {
$pp = (Get-ItemProperty "HKLM:\SOFTWARE\Classes\$progId\CurVer").{(default)}
getClsid -progId $pp
} else {
throw "Are you sure that's a ProgId?"
}
}
getClsid -progId 'WScript.Shell'
1 “组件ID”不是通常的COM术语,但CLSID(对于“Class Id”)是;我想这就是你的意思。