4

我正在尝试使用新的 EventSource(来自 nuget 的 Microsoft.Diagnostics.Tracing.EventSource)及其对 ETW 通道的新支持,以便写入 Windows 事件日志。代码就位,它正确地写入了我的工作站事件日志。我很激动。

现在是困难的部分。利用此功能的应用程序是 Web 服务,我们使用 webdeploy 将其部署为构建-部署-测试系统的一部分。因为使用 ETW 通道需要通过 wevtutil.exe 静态注册提供程序清单。EventSource 文档指出,这最好作为安装程序的一部分来完成,但这似乎有点超出了 webdeploy 的能力。

我们的目标是能够在执行 webdeploy 包之前立即自动卸载驻留在目标服务器上的清单,然后在 webdeploy 同步完成后导入新的清单。我们不打算这样做,但这似乎是最明智的方式。

出于这个原因,这似乎是 powershell 远程处理可能能够解决的问题,但这不是我很了解的领域。

有没有人做过这样的事情?有没有更好或更简单的方法?

4

1 回答 1

4

这里只有几个要求。A) 远程计算机必须启用 PowerShell 远程处理,这也意味着它必须具有 PowerShell 2.0 或更高版本 B) 在本地计算机上运行的脚本必须能够以管理员身份运行,并且使用的凭据必须在远程计算机上具有管理员权限。如果你能满足这些要求,那么这应该是小菜一碟。

在远程机器上,您需要执行两个命令来启用远程处理:

Set-ExecutionPolicy RemoteSigned
Enable-PSRemoting -Force

然后在本地机器上从提升的提示符下,您应该能够从脚本执行类似这样的操作:

# these two paths assume these files have been copied to the remote computer and to a directory
# in which the service account has privileges to read i.e. not under a userprofile dir.
$etwDllPath = c:\somepath\myassembly.mysourcename.etwManifest.dll
$etwManPath = c:\somepath\myassembly.mysourcename.etwManifest.man
$s = New-PSSession -ComputerName <remoteComputerName>
Invoke-Command -Session $s {param($man) wevtutil.exe um $man} -arg $etwManPath
Invoke-Command -Session $s {param($man,$dll) wevutil.exe im $man /rf:$dll /mf:$dll} -arg $etwManPath, $etwDllPath
Remove-PSSession $s

如果您可以避免使用带有空格的远程路径,请尝试这样做。这将使这更容易。:-)

于 2014-02-04T00:28:47.367 回答