2016-12-22 19 views
0

我们正在尝试收集登录到Windows 7客户端的用户的映射驱动器。为此,我们需要创建一个计划任务并让它以该用户的身份运行。这工作正常,但问题是从计划的任务中检索数据。从计划任务中检索数据

代码

Invoke-Command -ScriptBlock { 
    $User = 'John' 
    $Script = 'C:\Users\' + $User + '\AppData\Local\Temp' + '\Script.ps1' 
    $File = 'C:\Users\' + $User + '\AppData\Local\Temp' + '\Data.txt' 


    $Code = { 
     $User = 'John' 
     $File = 'C:\Users\' + $User + '\AppData\Local\Temp' + '\Data.txt' 
     Get-WmiObject -Class win32_mappedlogicaldisk | Select-Object Name, ProviderName | 
      Export-Csv $File -Encoding UTF8 -NoTypeInformation 
    } 

    $Code | Set-Content $Script -Encoding utf8 

    schtasks /create /RL HIGHEST /SC ONCE /ST 23:00 /TN "Test" /TR "powershell.exe -ExecutionPolicy Bypass -File '$Script'" /RU "$env:USERDNSDOMAIN\$User" 
    schtasks /run /TN "Test" 
    schtasks /delete /F /TN "Test" 

    for ($i = 0; $i -le 5; $i++) { 
     if (Test-Path $File) { 
      Import-Csv $File 
      Break 
     } 
     else { 
      Start-Sleep -Seconds 1 
     } 
    } 

} -ComputerName $Computer 

这个问题似乎被检索从用户$ENV:Temp文件夹中的Data.txt。这似乎是一个重复的事情,是否没有一个更干净的方式来做到这一点?

谢谢你的帮助。

+0

将数据写入服务器上的共享? –

+0

Thx小费!你只是觉得有更好的办法。因为现在需要检查文件何时等待。 – DarkLite1

+0

你打算在加入域名的计算机上运行此操作吗?如果是这样,有更简单的方法来做到这一点.. –

回答

0

因为它是一个非交互脚本,我会用同样的方法,只是在等待循环的缩短版:

while (!(Test-Path $File)) { Start-Sleep 1 } 

Import-Csv $File 

多一点优雅,但基本上是相同的。

0

我会去下面的东西,作为Login Script

$File = "\\server\share\$($env:username).csv" 

if (!(Test-Path $File)) { 
    Get-WmiObject -Class win32_mappedlogicaldisk | Select-Object Name, ProviderName | Export-Csv $File -Encoding UTF8 -NoTypeInformation 
} 

由于这是一个登录脚本,它会在用户的上下文中运行(并获得唯一的映射驱动器),并且将文件写入到一个中央共享,而不是他们的本地驱动器,所以它会更容易让你获得数据。

如果想要另一个例子中,你可以移动/删除文件酌情或删除Test-Path检查和添加-AppendExport-Csv,它会在每次登录记录保存到硬盘文件。