[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[问题求助] PowerShell怎样使用指定的guid的com组件?

我想使用下面这个guid的com组件, 应该怎样写代码?
{944DE083-8FB8-45CF-BCB7-C477ACB2F897}

下面的代码能获取到某个组件的guid, 我的问题, 正好反过来了, 我只知道guid但是不知道哪个组件
  1.     $Objshell = New-Object -COMObject "Shell.Application"
  2.     ($objshell | Get-Member).TypeName
复制代码

本帖最后由 jyswjjgdwtdtj 于 2025-3-22 15:25 编辑

回复 1# 小白龙
  1. [void][Reflection.Assembly]::LoadWithPartialName("microsoft.visualbasic")      
  2. $Objshell=[system.activator]::Createinstance([system.type]::GetTypeFromClsid("{944DE083-8FB8-45CF-BCB7-C477ACB2F897}"))  
  3. write-host [microsoft.visualbasic.information]::typename($objshell)
复制代码
然而只能获取到类名 而非progid
你好

TOP

回复 2# jyswjjgdwtdtj


    使用“1”个参数调用“CreateInstance”时发生异常:“检索 COM 类工厂中 CLSID 为 {944DE083-8FB8-45CF-BCB7-C477ACB2F897} 的组件失败,原因是出现以下错误: 80040154 没有注册类 (异常来自 HRESULT:0x800
40154 (REGDB_E_CLASSNOTREG))。”
所在位置 行:4 字符: 1
+ $Objshell=[system.activator]::Createinstance([system.type]::GetTypeFr ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: ( [], MethodInvocationException
    + FullyQualifiedErrorId : COMException

[microsoft.visualbasic.information]::typename System.__ComObject

TOP

本帖最后由 jyswjjgdwtdtj 于 2025-3-22 15:49 编辑

回复 3# 小白龙


powershell获取的clsid不是com组件真的clsid
比如wshshell的clsid是72C24DD5-D70A-438B-8A42-98424B88AFB8 但powershell给出了41904400-be18-11d3-a28b-00104bd35090
更正一下 这样才能获取到progid
  1. $s=@'
  2. using System;
  3. using System.Runtime.InteropServices;
  4. namespace ns
  5. {
  6.     public class com
  7.     {
  8.         [DllImport("ole32.dll")]
  9.         static extern int ProgIDFromCLSID([In] ref Guid clsid, [MarshalAs(UnmanagedType.LPWStr)] out string lplpszProgID);
  10.         public static string Getprogid(string clsid)
  11.         {
  12.             string progId = "";
  13.             Guid guid = new Guid(clsid);
  14.             ProgIDFromCLSID(ref guid, out progId);
  15.             return progId;
  16.         }
  17.     }
  18. }
  19. '@
  20. add-type -typedefinition $s
  21. [ns.com]::Getprogid("{72C24DD5-D70A-438B-8A42-98424B88AFB8}")
复制代码
你好

TOP

回复 4# jyswjjgdwtdtj


    add-type : 无法添加类型。类型名称“Microsoft.CodeAnalysis.EmbeddedAttribute”已存在。
所在位置 行:22 字符: 1
+ add-type -typedefinition $s
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (Microsoft.CodeAnalysis.EmbeddedAttribute:String) [Add-Type],Exception
    + FullyQualifiedErrorId : TYPE_ALREADY_EXISTS,Microsoft.PowerShell.Commands.AddTypeCommand

WScript.Shell.1

TOP

回复 5# 小白龙


   虽然不知道为什么报错了还是能输出结果 但确实能用不是吗
你好

TOP

直接查询注册表
  1. gi 'hklm:\software\classes\clsid\{72C24DD5-D70A-438B-8A42-98424B88AFB8}\progid'
复制代码
  1. cmd /c reg query 'hkcr\clsid\{72C24DD5-D70A-438B-8A42-98424B88AFB8}\progid'
复制代码

TOP

回复 7# Five66
显示下面这个, 这个guid好像是和uiautomation相关的

    Name                           Property                                                                                                        
----                           --------                                                                                                        
progid                         (default) : WScript.Shell.1

TOP

回复 8# 小白龙


   

那是自动化对象 ,New-Object -COMObject 创建出来的都是自动化对象 ,基于com的 ,但并不是所有com都是自动化对象 ,例如一般的com或可连接对象 ,com信息都在注册表里

TOP

再发一图 ,出自《COM原理与应用》

TOP

返回列表