0

我有一个具有 gui 用户界面的 PowerShell 应用程序,我的目标是在一个中心位置记录我向其发布应用程序的所有用户的活动。

此外,这必须是安全的,因此诸如“授予每个人对日志文件的写入权限”之类的解决方案不是可接受的解决方案。

我相信我已经成功地以另一个用户身份运行了 powershell,但是当它尝试运行 out-file 或 >> 命令时我的函数会中断。

这是我到目前为止尝试过的

function Start-ElevatedCode
{
    param([ScriptBlock]$Code)
    Start-Process -Credential $logCred -FilePath C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -WorkingDirectory \\Server\d$ -ArgumentList $code
    Start-Process -FilePath C:\Windows\System32\cmd.exe -Credential $logCred
    Start-Process $PSHOME\powershell.exe -ArgumentList "-NoExit","-Command `"&{`"`this is output string`' >> `'D:\Pojo Super User\Change.txt`'`"}`"" -Wait
} 

显然,我不需要所有这三个,而只是我可以开始工作的一个。第一行是我真正需要工作的,另外两行只是用于测试/示例。
这三个命令的输出分别为:
Out-file : The device is not ready.

Start-Process : This command cannot be executed due to the error: The directory name is invalid.

The device is not ready.

我传入的 $code var 是:
$code = {$logString | Out-File -FilePath 'D:\LogPath\Change.txt'}

请仅使用 Powershell V2 及以下版本和 cmd 命令。这必须适用于所有系统。

任何人都知道为什么会生成此通用系统错误消息?
命令net helpmsg 21

4

2 回答 2

0

如果您想集中记录,请通过事件转发Write-EventLog使用和收集事件。

于 2013-07-22T18:19:05.260 回答
0

我想出了一个解决方案,并发布以显示我想要实现的目标:
现在我直接远程连接到服务器并执行命令。

Function ActivityLog {
param ($logEntry)
    $sesh = New-PSSession -ComputerName theserver -Credential $logCred
    invoke-command -Session $sesh {param($str) $str | out-file 'D:\myApplication\Activity.log' -Append} -Args $logEntry 
    Remove-PSSession -Session $sesh
}
$string = "$date : User $user Restarted application with commandLine : $cmd and PID: $pid"
ActivityLog $string

尽管此函数按预期工作,但将字符串写入文本文件不应花费 1/2 秒。我将把这个问题留几天,希望有人有一个效率更高的解决方案。(不需要远程连接的)

于 2013-07-22T18:43:53.133 回答