2011-09-21 70 views
10

我有一個腳本(我們稱之爲myPSScript.ps1),它接受兩個參數並執行預定義的步驟。腳本位於人員登錄並執行腳本的Windows Server框中。支持兩個用戶在給定的時間登錄。Powershell - 查找調用腳本的用戶

我想找出誰調用了腳本。

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

這適用於當前用戶登錄並嘗試運行腳本。但是如果我在計劃任務中有一個批處理文件並運行相同的腳本呢?

在這種情況下,同樣的命令返回一個null異常,因爲沒有人登錄到機器中。

有沒有辦法找出哪個/哪個進程調用了powershell腳本。我隱約記得Start-Transcript記錄哪些用戶的命令運行等,所以這應該是可能的?

謝謝! Sanjeev

回答

18

有趣的問題。我寫了一個腳本,用三種不同的方式來獲得用戶,像這樣:

([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 

保存爲test.ps1並把它稱爲使用runas爲:

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

而且我得到了域\用戶的所有三次輸出。使用runas來區分我以(我!!)身份登錄的用戶和運行它的域\用戶。所以它確實給了正在運行腳本的用戶。

+0

完美。這也適用於使用來自不同機器和不同用戶的Invoke-Command觸發腳本 - 這正是我正在尋找的。現在我可以審計誰做什麼,什麼時候:) – Sanjeev

+0

還有一個問題。假設一個人使用域用戶登錄到Windows服務器。在這種情況下,腳本給了我們域用戶,但是當它被多個人使用時,這並沒有幫助。終端服務管理器顯示客戶端名稱,該名稱是該用戶從中連接的客戶端的名稱。有沒有辦法獲得這些信息? – Sanjeev

+0

使用PSTerminalServices模塊是獲取該信息的選項之一。 – Sanjeev