如何找到wscript.shell的组件?

时间:2014-01-07 15:00:21

标签: powershell com

我尝试了以下内容:

$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}" }

然而,我没有!我在找正确的地方吗?

1 个答案:

答案 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”)是;我想这就是你的意思。