返回列表 发帖

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

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

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

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

回复 1# 小白龙
[void][Reflection.Assembly]::LoadWithPartialName("microsoft.visualbasic")      
$Objshell=[system.activator]::Createinstance([system.type]::GetTypeFromClsid("{944DE083-8FB8-45CF-BCB7-C477ACB2F897}"))  
write-host [microsoft.visualbasic.information]::typename($objshell)COPY
然而只能获取到类名 而非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
$s=@'
using System;
using System.Runtime.InteropServices;
namespace ns
{
    public class com
    {
        [DllImport("ole32.dll")]
        static extern int ProgIDFromCLSID([In] ref Guid clsid, [MarshalAs(UnmanagedType.LPWStr)] out string lplpszProgID);
        public static string Getprogid(string clsid)
        {
            string progId = "";
            Guid guid = new Guid(clsid);
            ProgIDFromCLSID(ref guid, out progId);
            return progId;
        }
    }
}
'@
add-type -typedefinition $s
[ns.com]::Getprogid("{72C24DD5-D70A-438B-8A42-98424B88AFB8}")COPY
你好

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

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

TOP

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

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

TOP

回复 8# 小白龙


   

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

TOP

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

TOP

返回列表