Wix 自定义操作中的安全异常

Security Exception in Wix Custom Action

我有一个我知道被调用的自定义操作,因为 1) 我可以在我的日志中看到它,2) 日志报告它正在抛出安全异常。

Exception thrown by custom action:
System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.Security.SecurityException: The source was not found, but some or all event logs could not be searched.  Inaccessible logs: Security, State.
   at System.Diagnostics.EventLog.FindSourceRegistration(String source, String machineName, Boolean readOnly, Boolean wantToCreate)
   at System.Diagnostics.EventLog.SourceExists(String source, String machineName, Boolean wantToCreate)
   at System.Diagnostics.EventLog.SourceExists(String source)
   at EventTestCustomAction.CustomActions.CreateEventTestEventLog(Session session) in c:\erase\code\EventTest\EventTestCustomAction\CustomAction.cs:line 16

对于我的包元素,我定义了:

<Package InstallerVersion="500" Compressed="yes" InstallScope="perMachine" InstallPrivileges="elevated" />

我将自定义操作定义为延迟执行:

<CustomAction Id='CreateLog' BinaryKey='CustomActionDll' DllEntry='CreateEventTestEventLog' Return='check' Execute='deferred'/>

InstallExecuteSequence 定义为:

<InstallExecuteSequence>
    <Custom Action="IsPrivileged" Before="AppSearch"><![CDATA[Not Privileged]]></Custom>
    <Custom Action="CreateLog" After="InstallFiles" >NOT Installed AND NOT REMOVE</Custom>
</InstallExecuteSequence>

我运行正在从非提升但具有管理员权限的命令提示符中进行操作。当 运行 使用 msiexec /i \path\to\installer.msi 时,它会升高。在我在那里进行自定义操作之前,安装程序会 运行 正常并将文件复制到 Program Files 下的正确目录中就好了。

导致异常的API是

EventLog.SourceExists("mysourcename"); 

当然,我可以 link Wix Util 并使用 <util:EventSource blah blah blah/>,但在这种情况下我有理由不想这样做。 Wix Util 库以某种方式解决了这个问题。几周前,我还尝试查看注册表和当前控件集,以不同的方式进行了查看,但由于安全原因,它不允许我打开注册表项。

我认为安装程序 运行 在使用 LocalSystem 帐户升级后。似乎很明显他们没有。但是 util:EventSource 是怎么逃脱的呢?有没有我遗漏的参数?

好的,找到答案了。需要将我的自定义操作中的 Impersonate 属性设置为“否”。显然默认是yes。

像这样更改了我的自定义操作,现在可以使用了:

<CustomAction Impersonate="no" Id='CreateLog' BinaryKey='CustomActionDll' DllEntry='CreateEventTestEventLog' Return='check' Execute='deferred'/>