我们正在尝试收集登录到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
问题似乎是从用户Data.txt
文件夹中检索$ENV:Temp
。这似乎是一个重复的事情,有没有更简洁的方法这样做?
感谢您的帮助。
答案 0 :(得分:0)
由于它是一个非交互式脚本,我使用相同的方法,只需缩短版本的等待循环:
while (!(Test-Path $File)) { Start-Sleep 1 }
Import-Csv $File
更优雅,但基本相同。
答案 1 :(得分: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
}
由于它是一个登录脚本,它将在用户上下文中运行(并且仅获取其映射的驱动器),并将文件写入中央共享而不是本地驱动器,因此您可以更轻松地获取数据。 / p>
如果您需要其他示例,可以根据需要移动/删除文件,或者删除Test-Path
检查并将-Append
添加到Export-Csv
,它会将驱动器记录到文件中在每次登录时。