首页 文章

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

提问于
浏览
0

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

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

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

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

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

如果我做一个写主机,我只是回到'146771',这是我似乎想要的,并且get-member将它显示为[System.String]

然后我把它扔到一个分区, grab 最后一个令牌,即用户名整个脚本正常工作,如果我手动输入过滤器字符串,而不是我已尝试过的任何格式的变量

${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 回答

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

相关问题