1

我正在尝试编写一个脚本来从服务器检索登录用户的用户名,(这是一个使用未格式化字符串数据的练习我知道其他方法来获取这些数据,所以请不要建议他们)

我正在尝试将 WMI 查询中的数字字符串传递到 where-object 过滤器这是从 Win32_LoggedOnUser 类读取 WMI 输出

$Name | where {$_.Dependent -like $ID } | select Antecedent

问题似乎在于读取 ID 变量,我尝试了几种变体,这是一个与过滤器格式的一些通配符连接的值,当我将字符串转换为 CSV 格式时,我得到了提示,所以我可以更轻松地做a [regex]::Split,我收到 InputObject 为空的错误,如果我单独运行上面的行,我只会得到一个空结果,如果我手动输入过滤器字符串,我会得到我想要的输出。

[String]$ID = "'*"+$UserSessions.LogonId+"*'"

如果我做一个写主机,我就会回来 ' 146771 ',这就是我想要的,get-member 显示它是一个 [System.String]

然后我将其扔到一个拆分中,该拆分抓取最后一个令牌,即用户名,如果我手动输入过滤器字符串而不是我尝试过的任何格式的变量,整个脚本都可以正常工作

${ID}   ($ID)   ""$ID""  $($ID)

这是完整的脚本供参考

$UserSessions = GWMI Win32_LogonSession | where { $_.LogonType -eq 2}

[String]$ID = "'*"+$UserSessions.LogonId+"*'"

$Name = GWMI Win32_LoggedOnUser

$Results = $Name | where {$_.Dependent -like $ID } | select Antecedent

$Split = $Results | ConvertTo-Csv

$Splat =  [regex]::Split($Split, """")[9]

Write-Host "User = $Splat"
4

1 回答 1

2

gwmi Win32_LogonSession可能会产生多个结果,因此您需要考虑这一点。此外,拆分产生的字段比您预期的要少。

这对我有用:

gwmi Win32_LogonSession | ? { $_.LogonType -eq 2 } | % {
  $ID = "*$($_.LogonId)*"
  gwmi Win32_LoggedOnUser | ? { $_.Dependent -like $ID } | select Antecedent
} | % {
  $name = ($_.Antecedent -split '"')[3]
  Write-Host "User = $name"
}
于 2013-09-10T17:50:03.403 回答