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'/>
我有一个我知道被调用的自定义操作,因为 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'/>