文件外提升的凭据错误:设备未就绪

时间:2013-07-22 16:24:27

标签: powershell logging credentials

我有一个具有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

2 个答案:

答案 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秒。 我将这个问题保持开放几天,希望有人能提供更高效率的解决方案。 (不需要远程连接的那个)