2013-08-28 79 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

相关问题