所以我试图找到之前登录系统的用户的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语法问题。
答案 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替换单引号或完全删除引号。