2016-12-22 5 views
0

Wir versuchen, die zugeordneten Laufwerke eines Benutzers zu erfassen, der an einem Windows 7-Client angemeldet ist. Dazu müssen wir eine geplante Aufgabe erstellen und sie als diesen Benutzer ausführen lassen. Das funktioniert gut, aber das Problem besteht darin, die Daten von der geplanten Aufgabe abzurufen.Abrufen von Daten aus dem geplanten Task

-Code

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 

Das Problem scheint die Data.txt vom Benutzer $ENV:Temp Ordner abrufen werden. Es scheint ein bisschen eine sich wiederholende Sache zu sein, gibt es keinen saubereren Weg, dies zu tun?

Vielen Dank für Ihre Hilfe.

+0

Schreiben Sie die Daten in eine Freigabe auf einem Server? –

+0

Danke für den Tipp! U dachte nur, es gäbe einen besseren Weg. Denn jetzt muss überprüft werden, wann die Datei mit einer Wartezeit darauf vorhanden ist. – DarkLite1

+0

Werden Sie dies auf einem Domänen-Computer ausführen? Wenn ja, gibt es viel einfachere Möglichkeiten, dies zu tun. –

Antwort

0

Da es sich um ein nicht interaktives Skript, ich den gleichen Ansatz verwenden würde, nur mit einer verkürzten Version der Warteschleife:

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

Import-Csv $File 

Ein bisschen eleganter, aber im Wesentlichen gleich.

0

Ich würde für etwas wie die unten als Login Script gehen.

$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 
} 

Da es ein Anmeldeskript ist es in dem Benutzerkontext ausgeführt wird (und nur ihre zugeordnete Laufwerke bekommen) und Dateien an einen zentralen Anteil schreiben, anstatt ihrem lokales Laufwerk, so dass es viel einfacher für Sie zu erhalten die Daten.

Wenn Sie eine andere Probe möchten, können Sie die Dateien nach Bedarf verschieben/löschen oder entfernen Sie die Test-Path Prüfung und fügen -Append zu Export-Csv und es wird bei jeder Anmeldung an die Dateiprotokollierung Laufwerke halten.