Powershell将变量作为过滤字符串传递

时间:2013-09-10 16:49:26

标签: powershell conditional-statements

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

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

读取WMI输出
$Name | where {$_.Dependent -like $ID } | select Antecedent

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

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

1 个答案:

答案 0 :(得分:1)

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"
}