Проблема с Get-ADObject и Where-Object с использованием переменной - PullRequest
0 голосов
/ 28 октября 2018

Я хочу получить пароль восстановления BitLocker через powershell, указав идентификатор ключа восстановления. Я знаю, что это можно сделать с помощью приложения Active Directory Users and Computers, что я и пытаюсь воспроизвести.

Мой процесс в настоящее время выглядит следующим образом:

  • Запрашивает у пользователя идентификатор ключа восстановления
  • Получить все объекты AD, для которых ObjectClass равен msFVE-RecoveryInformation
  • Отфильтруйте эти результаты по DistinguishedName, что должно позволить мне получить нужную мне индивидуальную запись.
  • Запишите полученный пароль восстановления BitLocker

Проблема, с которой я сталкиваюсь, заключается в том, что при использовании переменной в предложении Where-Object я не получаю никаких результатов. Если я ввожу жесткий код в идентификатор ключа восстановления, он просто отлично работает.

Вот код, который у меня есть:

$key = (read-host -Prompt "Enter starting portion of recovery key ID (8 Digits)").ToUpper()
$recoveryInformation = Get-ADObject -Filter 'ObjectClass -eq "msFVE-RecoveryInformation"' | Where-Object {$_.DistinguishedName -like "*$key*"}
echo $recoveryInformation

Я попытался сделать это несколькими разными способами, и все они закончились одним и тем же результатом, когда жестко закодированное значение сработало бы, а переменная - нет. Это наводит меня на мысль, что это то, что я получаю от пользователя, но я врезался в стену. Любая помощь будет принята с благодарностью.


Конечный результат

В конце концов, проблема с моим кодом заключается в том, что я использовал where-object вместо where. После того, как я сделал это изменение, все заработало так, как я планировал.

Примеры, предоставленные postanote , дают намного лучший результат и, безусловно, более устойчивы. Последний пример - лучший, чтобы дать конечный результат, который я искал.

1 Ответ

0 голосов
/ 29 октября 2018

Почему бы просто не использовать встроенный командлет PowerShell, специально разработанный для получения этой информации?

Вот несколько вещей, которые можно напрямую использовать или настроить для вашего случая использования. Смотрите пример № 5.

Получение информации о восстановлении BitLocker из AD с помощью PowerShell

# Example Commands

# 1. Get BitLocker recovery information for a single computer:

Get-BitLockerRecovery computer1

# 2. Get BitLocker recovery information for a list of computers:
Get-BitLockerRecovery "computer1","computer2"

# or

"computer1","computer2" | Get-BitLockerRecovery

# 3. Get BitLocker recovery information for computers in an OU:
Get-ADComputer -Filter { name -like "*" } `
  -SearchBase "OU=Sales,DC=fabrikam,DC=com" |
  Get-BitLockerRecovery

# 4. Get the BitLocker recovery information for a specific password ID:
Get-BitLockerRecovery -PasswordID B1FED823

# 5. Get BitLocker recovery information for all msFVE-RecoveryInformation objects in the current domain:
$filter = "(objectClass=msFVE-RecoveryInformation)"
Get-ADObject -LDAPFilter $filter | ForEach-Object {
  Get-ADPathname (Get-ADPathname $_.DistinguishedName `
  -Format X500Parent) -Format Leaf -ValuesOnly |
  Get-BitLockerRecovery
}

Или при тестировании вашего подхода к переменным без использования ключевой строки, переданной пользователем ...

# First ask for a computername
$usrInput = Read-Host "Type in name of computer you want to retrieve the BitLocker recovery information"

# Get the computer object from Active Directory
$objComputer = Get-ADComputer $usrInput

# Find the AD object which match the computername and is of the class "msFVE-RecoveryInformation"
$objADObject = get-adobject -Filter * | Where-Object {$_.DistinguishedName -match $objComputer.Name -and $_.ObjectClass -eq "msFVE-RecoveryInformation"}

# Filter the result so you'll get only the recovery key
(($objADObject.DistinguishedName.Split(",")[0]).split("{")[1]).Substring(0,$trimming.Length-1)

Или этот подход ...

$computers = get-adobject -Filter * | Where-Object {$_.ObjectClass -eq "msFVE-RecoveryInformation"}

$key = (read-host -Prompt "Enter starting portion of recovery key ID").ToUpper()
$records = $computers | where {$_.DistinguishedName -like "*$key*"}

foreach ($rec in $records) {
    $computer = get-adcomputer -identity ($records.DistinguishedName.Split(",")[1]).split("=")[1]
    $recoveryPass = Get-ADObject -Filter {objectclass -eq 'msFVE-RecoveryInformation'} -SearchBase $computer.DistinguishedName -Properties 'msFVE-RecoveryPassword'
    [pscustomobject][ordered]@{
        Computer = $computer
        'Recovery Key ID' = $rec.Name.Split("{")[1].split("}")[0]
        'Recovery Password' = $recoveryPass.'msFVE-RecoveryPassword'
    } | Format-List
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...