在Powershell中使用变量进行搜索

时间:2016-08-18 12:05:11

标签: powershell

所以我试图找到之前登录系统的用户的SID。我们的系统有一部分非管理用户(一开始没有#)和管理用户(带#)。到目前为止,我的PowerShell脚本是:

$CurrentDomainUser = wmic computersystem get username
$Separator = "\"
$CurrentDomainUserSplit = $CurrentDomainUser.split($Separator)
$DomainUser= $CurrentDomainUserSplit[3]

New-PSDrive -PSProvider Registry -Name HKU -Root HKEY_Users

$UserSID = ls 'hklm:software/microsoft/windows nt/currentversion/profilelist' | ? {
               $_.getvalue('profileimagepath') -match '$DomainUser' -and
               $_.getvalue('profileimagepath') -notmatch '#'
           } | % pschildname

如果我在上面的最后'$DomainUser'行中使用$UserSID = ...,则此脚本无效。如果我输入我正在搜索的实际值, 就可以工作。

我猜这是一个简单的PowerShell语法问题。

2 个答案:

答案 0 :(得分:2)

使用Get-WmiObject而不是wmic

$DomainUser = (Get-WmiObject Win32_ComputerSystem).Username -replace '^.+\\'
New-PSDrive -PSProvider Registry -Name HKU -Root HKEY_Users
$UserSID = Get-ChildItem 'HKLM:/software/microsoft/windows nt/currentversion/profilelist' |
    Where-Object { $_.getvalue('profileimagepath') -match $DomainUser -and $_.getvalue('profileimagepath') -notmatch '#'} |
    ForEach-Object pschildname

使用NTAccount.Translate

Windows已经知道如何将名称转换为安全标识符。我们可能会使用这种获取SID的方法。

$userName = (Get-WmiObject Win32_ComputerSystem).Username 
$ntAccount = New-Object System.Security.Principal.NTAccount($userName)
$sid = $ntAccount.Translate([System.Security.Principal.SecurityIdentifier])

答案 1 :(得分:1)

... -match '$DomainUser' ...

PowerShell仅在双引号字符串中扩展变量,而不是在单引号字符串中。用双qoutes替换单引号或完全删除引号。