我有一个具有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命令。这必须适用于所有系统。
任何人都知道为什么会生成此通用系统错误消息?
cmd net helpmsg 21
答案 0 :(得分:0)
如果您想集中记录,请使用Write-EventLog
并通过event forwarding收集活动。
答案 1 :(得分: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秒。 我将这个问题保持开放几天,希望有人能提供更高效率的解决方案。 (不需要远程连接的那个)