2016-12-22 6 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! Uはちょうど良い方法があると思った。これは、ファイルが存在するときに待ち時間を確認する必要があるためです。 – 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チェックを外してExport-Csv-Appendを追加し、それがすべてのログオン時にファイルへのロギングのドライブをしておこうことができます。

関連する問題