2011-09-21 3 views
10

Ho uno script (chiamiamolo myPSScript.ps1) che accetta due parametri ed esegue passaggi predefiniti. Lo script si trova in una casella di Windows Server che le persone accedono ed eseguono lo script. Supporta due utenti per accedere al momento specifico.PowerShell - Trova l'utente che ha invocato lo script

Voglio scoprire chi ha invocato la sceneggiatura.

(Get-WmiObject -Class Win32_Process | Where-Object {$_.ProcessName -eq 'explorer.exe'}).GetOwner() | Format-Table Domain, User 

Questo funziona quando l'utente è attualmente connesso e sta tentando di eseguire lo script. Ma cosa succede se ho un file batch in attività pianificate ed eseguo lo stesso script?

In tal caso lo stesso comando restituisce un'eccezione nulla, poiché non vi è nessuno registrato nella macchina.

C'è un modo per scoprire chi/quale processo ha richiamato lo script di PowerShell. Ricordo vagamente i record Start-Transcript su quale utente viene eseguito il comando da etc, quindi dovrebbe essere possibile?

Grazie! Sanjeev

risposta

18

Interessante domanda. Ho scritto uno script con tre diversi modi per ottenere l'utente in questo modo:

([Environment]::UserDomainName + "\" + [Environment]::UserName) | out-file test.txt 
"$env:userdomain\$env:username" | out-file -append test.txt 
[Security.Principal.WindowsIdentity]::GetCurrent().Name | out-file -append test.txt 
notepad test.txt 

Salvato come test.ps1 e lo ha chiamato con runas come:

runas /user:domain\user "powershell e:\test.ps1" 

E ho avuto il dominio \ utente tutto tre volte nell'output. Usato runas per distinguere semplicemente tra l'utente che ho effettuato l'accesso come (me !!) e il dominio \ utente con cui stavo eseguendolo come. Quindi dà all'utente che sta eseguendo lo script.

+0

Perfetto. Questo funziona anche quando lo script viene attivato utilizzando Invoke-Command da una macchina diversa e da diversi utenti - che è esattamente quello che stavo cercando. Ora posso controllare chi fa cosa e quando :) – Sanjeev

+0

Un altro problema. Diciamo che una persona è registrata su un server Windows usando un utente del dominio. In tal caso lo script ci fornisce l'utente del dominio, ma ciò non è utile quando è utilizzato da più di una persona. Terminal Service Manager mostra il nome del cliente, che è il nome del client da cui la persona ha effettuato la connessione. C'è un modo per ottenere queste informazioni? – Sanjeev

+0

L'utilizzo del modulo PSTerminalServices è una delle opzioni per ottenere tali informazioni. – Sanjeev