找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 6885|回复: 9

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

[复制链接]
发表于 2025-3-22 11:25:19 | 显示全部楼层 |阅读模式
我想使用下面这个guid的com组件, 应该怎样写代码?
{944DE083-8FB8-45CF-BCB7-C477ACB2F897}

下面的代码能获取到某个组件的guid, 我的问题, 正好反过来了, 我只知道guid但是不知道哪个组件
  1.     $Objshell = New-Object -COMObject "Shell.Application"
  2.     ($objshell | Get-Member).TypeName
复制代码
发表于 2025-3-22 14:52:56 | 显示全部楼层
本帖最后由 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
 楼主| 发表于 2025-3-22 15:17:43 | 显示全部楼层
回复 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
发表于 2025-3-22 15:29:36 | 显示全部楼层
本帖最后由 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}")
复制代码
 楼主| 发表于 2025-3-22 15:58:01 | 显示全部楼层
回复 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
发表于 2025-3-22 17:09:04 | 显示全部楼层
回复 5# 小白龙


   虽然不知道为什么报错了还是能输出结果 但确实能用不是吗
发表于 2025-3-22 21:57:46 | 显示全部楼层
直接查询注册表

  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'
复制代码
 楼主| 发表于 2025-3-22 23:59:04 | 显示全部楼层
回复 7# Five66
显示下面这个, 这个guid好像是和uiautomation相关的

    Name                           Property                                                                                                        
----                           --------                                                                                                        
progid                         (default) : WScript.Shell.1
发表于 2025-3-23 01:17:21 | 显示全部楼层
回复 8# 小白龙


   

那是自动化对象 ,New-Object -COMObject 创建出来的都是自动化对象 ,基于com的 ,但并不是所有com都是自动化对象 ,例如一般的com或可连接对象 ,com信息都在注册表里
发表于 2025-3-23 01:21:43 | 显示全部楼层
再发一图 ,出自《COM原理与应用》
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 07:09 , Processed in 0.018013 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表