【问题标题】:Powershell event when CD burn starts from file explorer从文件资源管理器开始 CD 刻录时的 Powershell 事件
【发布时间】:2016-03-15 04:45:26
【问题描述】:

我未能找到任何可靠的方法来检测 CD/DVD 刻录过程何时开始。刻录工具只能是文件资源管理器。

我知道有一个事件日志“IMAPI CD-Burning COM 服务服务已成功发送启动控制”。

这样做的问题是,即使从未发生烧录,也会触发此(以及相应的停止)。似乎 WMP 之类的某些东西会在您初始化时触发该事件(单击刻录选项卡)。

我需要的是一种方法(wmi、imapi 等),它会在刻录过程实际开始时通知我。

不幸的是,我不知道足够多的 powershell 甚至不知道从哪里开始寻找。在这一点上,我只是在黑暗中疯狂地搜索,希望有人做了一些与我想要的足够接近的事情,但还没有找到任何东西。

谢谢,

【问题讨论】:

    标签: powershell events triggers cddvd


    【解决方案1】:

    您可以监控写操作的状态,但只能在您自己的应用程序中:Monitoring Progress With Events

    几个接口让您实现一个事件处理程序来接收 进度信息。例如,可以将事件对象附加到 数据写入者接收写入操作的状态。

    但是,没有Pre-burn action

    没有钩子或回调来预处理被烧录的数据 别人

    我唯一能想到的监控 IMAPI 系统范围的方法是挂钩 DLL 调用:

    是否可以使用 MadChook 挂钩 COM 接口方法?实际上 我想要做的是挂钩 IMAPI 接口(IDiscMaster) 刻录 CD。我想为该接口挂钩方法 RecordNow。 现在这个接口是通过 imapi.exe 实现的,explorer 做了一个 使用代理“Actxprxy.dll”对这个mentod进行进程外调用

    我已经通过挂钩 CoCreateInstance 和包装解决了这个问题 IDiscMaster 的所有方法,但后来我得到了很多 资源管理器调用 Cocreateinstance 时对我的钩子造成不必要的打击 次。

    我正在编写一个简单的程序来监控 Windows 中的 CD 刻录 探险家。我在 XP 中连接了 IDiscMaster::RecordDisc 和 IDiscFormat2Data::Write 并且工作正常。但如果我将 CD 刻录为 live 文件系统,不被监控。

    1. 我应该挂钩哪个函数?
    2. 我连接了 ICDBurn::Burn(此函数与 ICDBurn 的 vft 有 0x10 偏移)。每当我弹出菜单点击时, 资源管理器失败,Windows 将其关闭。错误代码是 STATUS_STACK_BUFFER_OVERRUN。

    但这很容易出错,并且需要一些特定的技能。

    【讨论】:

    • 谢谢。这给了我一些短语来进一步我的研究。更清楚地说,我不想修改数据,我只需要知道何时有人在文件资源管理器中单击“刻录到光盘”。即使通过 WMI 调用与文件资源管理器交谈以跟踪被点击的情况也可以解决我的问题。对于该事件,我什至不确定如何在 powershell 中获取它。这是一个页面,其中提供了有关特定事件hecfblog.com/2009/03/… 的一些信息,我尝试使用 Get-EventLog,但我尝试的一切都无效。
    • 我用 get-eventlog 解决了这个问题。我最大的障碍是我不是 Windows 用户,所以我还没有足够的词汇来进行有意义的搜索。 Get-EventLog系统 | where {$_.source -eq "cdrom"} 虽然我不知道是否有更好的东西我应该寻找,这还不是一个完整的解决方案,因为我必须定期轮询事件而不是有某种类型事件过滤器在弹出时告诉我。
    【解决方案2】:

    感谢您的帮助。自从询问以来,我发现至少在 Windows 7 中,但可能在其他版本的 Windows 中,就在 CD 驱动器进行写入之前,它会在 CD 驱动器上进行独占锁定。这在 MSFT 上的 IMAPI 参考 dox 中进行了讨论。这实际上是由几乎所有刻录应用程序完成的,而不仅仅是文件资源管理器,以防止多个事情弄乱写入过程。

    通过 cdrom 向系统发送一个 ID 代码为 133 的事件,可以对其进行监控以检测何时开始刻录。此事件似乎仅在刻录开始时生成,而不是由 OP 中讨论的其他事件生成。

    以下代码 sn-p 将附加一个事件侦听器,当事件出现时它会做出反应。

    我不太了解 powershell 或 windows,所以如果有人有建议让这个例子更好,我欢迎提出建议但是这似乎是功能性的。

    $WMI = @{
        Query = "select * from __InstanceCreationEvent 
            where TargetInstance isa 'Win32_NtLogEvent' 
            and TargetInstance.logfile = 'System' 
            and TargetInstance.SourceName = 'cdrom' 
            and TargetInstance.EventCode = '133'"
        Action = {
        write-host "CD Burn started"
        }
    }
    $Null = Register-WMIEvent @WMI
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-19
      • 2020-08-20
      • 2013-02-05
      相关资源
      最近更新 更多