2013-08-28 78 views
0

UPDATEPowerShell的 - 上次登錄的用戶 - 相同的輸入,不同的輸出

@ HAL9256

你的答案真的讓我覺得!

我做了一些谷歌上搜索更多的,發現這個網站,該網站提供了另一種方法

http://blogs.technet.com/b/heyscriptingguy/archive/2012/02/19/use-powershell-to-find-last-logon-times-for-virtual-workstations.aspx

到目前爲止,它的工作原理!

我遠程進入另一臺服務器運行powershell腳本,顯示最後登錄的用戶。

幾件事情

  1. 它只有當我在服務帳戶的上下文中運行一切正常,沒有 管理員
  2. 它需要幾分鐘的時間輸出

但是當我運行它在一個服務帳戶的contenxt中,我得到不同的輸出爲相同的輸入

$line_array = @() 
$multi_array = @() 
[hashtable]$my_hash = @{} 

foreach ($i in $args){ 
    $line_array+= $i.split(" ") 
} 

foreach ($j in $line_array){ 
    $multi_array += ,@($j.split("=")) 
} 

foreach ($k in $multi_array){ 
    $my_hash.add($k[0],$k[1]) 
} 

$Sender_IP = $my_hash.Get_Item("sender-ip") 


$eventList = @() 
Get-EventLog "Security" -computername $Sender_IP ` 
    | Where -FilterScript {$_.EventID -eq 4624 -and $_.ReplacementStrings[4].Length -gt 10 -and $_.ReplacementStrings[5] -notlike "*$"} ` 
    | Select-Object -First 2 ` 
    | foreach-Object { 
     $row = "" | Select UserName, LoginTime 
     $row.UserName = $_.ReplacementStrings[5] 
     $row.LoginTime = $_.TimeGenerated 
     $eventList += $row 
     } 
$userId = $eventList[0].UserName 
$userId 

舉例來說,我調用的命令行的腳本

script.ps1 "sender-ip=10.10.10.10" 

我第一次運行它,它輸出的用戶的窗口的登錄名

我第二次用相同的輸入運行同一個腳本,它輸出我用來運行powershell腳本的同一個服務帳戶

而當我嘗試使用相同的輸入運行相同的腳本時,我得到了相同服務帳戶的輸出。

~~~~~~~

接下來,我嘗試用另一個IP地址運行腳本

我第一次運行它的輸出窗口的登錄名

我第二次劇本運行該腳本,它輸出相同的服務帳戶從中PowerShell腳本運行

~~~~~~~

這似乎是一個patte RN。第一次運行的腳本,它返回正確的輸入,第二次運行,它返回服務帳戶。

這是怎麼發生的?

如何使腳本始終返回正確的輸出,無論它被調用多少次?

如何解決此問題?

回答

2

這是因爲您的腳本如何獲取有關上次登錄用戶的信息。

您正在從安全事件日誌中獲取上次登錄的用戶。這種「日誌」記錄大家誰的電腦...包括WMI的訪問,服務帳戶等

發生了什麼事是:腳本運行

  • 之前
    • Contoso的\用戶1登錄到計算機
    • 事件ID 4624 - 登錄成功 - Contoso的\用戶1登錄
  • 運行腳本首次
    • 腳本運行作爲Contoso的\ ServiceAccount
    • 腳本訪問計算機通過WMI拉安全事件日誌
    • 安全事件日誌顯示上次登錄的用戶是Contoso的\用戶1
    • 事件ID 4624 - 登錄成功 - Contoso的\ ServiceAccount登錄
    • 事件ID 4634 - 註銷成功 - Contoso的\ ServiceAccount登錄
  • 運行腳本第二次
    • 腳本運行作爲Contoso的\ ServiceAccount
    • 通過WMI腳本訪問計算機拉安全事件日誌
    • 安全事件日誌顯示上次登錄的用戶是Contoso \ ServiceAccount
    • 事件ID 4624 - 登錄成功 - Contoso的\ ServiceAccount登錄
    • 事件ID 4634 - 註銷成功 - Contoso的\ ServiceAccount登錄

這是因爲爲了訪問WMI,您必須在計算機上進行身份驗證。本質上,WMI使用您的服務帳戶「登錄」計算機,訪問它需要的信息,返回信息並註銷。

這就是爲什麼你會得到奇怪的結果。

爲了解決這個問題,你有3種選擇:

1.繼續使用相同的腳本拔出事件日誌條目。添加代碼以篩選出服務帳戶名稱。即用這個來獲取用戶名:

[System.Security.Principal.WindowsIdentity]::GetCurrent().Name 

然後使用「去哪兒-FilterScript」以濾除運行腳本的用戶。

此方法的唯一缺點是可能有很多其他服務帳戶正在運行各種計劃任務,或者啓動腳本可能會改變登錄用戶的「最後」登錄用戶的身份。將最後5個登錄用戶拉起來可能會更好,然後您可以更好地瞭解正在發生的事情。要獲取當前登錄的用戶

2.使用此代碼:

(gwmi -class win32_computerSystem -computer "ComputerName").username 

3.A獲得上次登錄的用戶的不同和獨特的方法是使用最後的寫訪問時間的用戶配置文件文件(ntuser.dat)。通常,只有以「交互式」登錄的用戶才能創建用戶配置文件。

(Get-ChildItem C:\users\*\ntuser.dat -Force | select @{e={(Split-path $_.Directory -Leaf)}},last* | sort lastwritetime -Descending 
+0

@ HAL9256:哇,這是非常徹底的!讓我試試看,我會讓你知道它是如何工作的。謝謝。 – Glowie

+0

很高興聽到你有東西在工作!樂意效勞! – HAL9256

相關問題