2016-08-18 2 views
0

Итак, я пытаюсь найти SID для пользователя, который ранее регистрировался в системе. В нашей системе есть разделение не административных пользователей (без # на старте) и административных пользователей (с #). Мой сценарий PowerShell до сих пор это:Поиск с использованием переменной в 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

Привет, в '$ CurrentDomainUserSplit [3]', why' 3'? И чего вы пытаетесь достичь в итоге? – sodawillow

+1

Используйте Get-WmiObject/Get-CimInstance для запроса Win32_ComputerSystem. Используя wmic для этого, синтаксический анализ немного глупо. –

+0

@sodawillow: выход CurrentDomainUserSplit [3] является частью имени пользователя команды «wmic computersystem get username» (без имени домена, обратных косых черт и т. Д.). –

ответ

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]) 
+0

Boom - это делает. Огромное спасибо! –

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

PowerShell расширяет переменные только в двойных кавычках, а не в одиночных кавычках. Замените одиночные кавычки двойными qoutes или полностью удалите кавычки.

+0

Крис Дент предложил это выше, но, похоже, он не работает - см. Мои комментарии к нему. –

+0

Тогда значение вашей строки не так, как вы думаете. –

+0

Спасибо, ты прав. В соответствии с разделом комментариев выше, вы были бы правы на общем уровне. Есть ли способ, которым я могу дать вам кредит на ваш вклад, и признав, что ответ Криса на самом деле приводит меня туда, где мне нужно быть? –

Смежные вопросы