Удаленно удалить несколько ключей реестра в подстановочной папке с помощью powershell? - PullRequest
0 голосов
/ 24 мая 2018

Я работаю над сценарием, который удалит ключи App-V, хранящиеся в реестре.Когда пользователь открывает приложение, оно создает ключ в следующем месте:

HKLM\SOFTWARE\Microsoft\AppV\MAV\Configuration\Packages\**PackageID**\UserConfigEx\**SID**

PackageID и SID уникальны каждый раз, и я хочу иметь возможность удалить SIDподключ в каждом ключе PackageID.

Пользователь вводит SID, а затем я хотел бы использовать подстановочный знак (если возможно) для перехода к каждому присутствующему идентификатору пакета.

Итакпока у меня есть следующее:

#Take user input
$SID = Read-Host "Please enter users SID"
$computer = Read-Host "Please enter computer name"

#Test connection
Write-Host "Connecting to $computer"

if (Test-Connection -ComputerName $computer -Quiet -BufferSize 16 -Count 1) {

#Connect to registry and delete key
try
{
    $reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey(‘LocalMachine’, $computer)
    $regKey = $reg.OpenSubKey(“HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\AppV\\MAV\\Configuration\\Packages\\*\\UserConfigEx\\$SID”,$true )

    if ($regkey.GetValue(“$SID”))
    {
        $regKey.DeleteValue(“$SID”)
        Write-Host
        Write-Host "$SID key deleted successfully" -ForegroundColor Green
    }
    else
    {
        Write-Host
        Write-Host "No keys with this SID exist." -ForegroundColor Red
    }


} catch {

    $ErrorMessage = $_.Exception.Message
    Write-Host "Unable to connect to $computer. Error: $($ErrorMessage)." -ForegroundColor Red 

}

} else 

    { 

    Write-Host "Unable to connect to $computer. Please ensure correct computer name / IP address has been entered correctly." -ForegroundColor Red

}

Если я запускаю это, я получаю:

You cannot call a method on a null-valued expression.
At line:51 char:9
+     if ($regkey.GetValue(“$SID”))
+         ~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

Я использую некоторые из сценариев, которые я получил помощь по здесь для удаленного подключения к машине.

Ответы [ 2 ]

0 голосов
/ 24 мая 2018
  • API реестра .NET не поддерживает подстановочные знаки (*) в ключевых путях .

    • В результате $regKey.GetValue() не удалось, потому что $regKey = $reg.OpenSubKey(...) вернул $null из-за отсутствия ключа, а вызов метода для $null всегда приводит к сообщению об ошибке, указанному в вопросе.
  • В отличие от этого, поставщик реестра PowerShell с помощью командлетов *-Item* делает, но вам нужно PowerShell remoting для его удаленного использования.

    • Удаленное взаимодействие PowerShell включено по умолчанию в Windows Server 2012 и более поздних версиях;в более старых версиях ОС вы можете включить ее, выполнив Enable-PSRemoting на целевых компьютерах (требуется PSv3 +).

    • При включенном удаленном взаимодействии PowerShell вам необходимочтобы обернуть ваш код в вызов Invoke-Command -ComputerName <name> { ... } (на который вам, возможно, придется также передавать учетные данные).

  • Если включение удаленного взаимодействия PowerShell не является вариантом, выдолжен эмулировать сопоставление на основе подстановочных знаков с помощью вложенного цикла на основе сопоставления для каждого элемента подстановочных знаков результатов из .GetSubkeyNames().

  • В качестве отступления: вам никогда не нужно экранировать \ как \\ в строках PowerShell;PowerShell использует ` в качестве escape-символа внутри "...", поэтому единственный символ, который вам нужен для выхода, - это `, как ``.

PowerShell Remoting-решение на основе:

Обратите внимание, что Invoke-Command -ComputerName ... должен вызываться из повышенного сеанса (Run As Administrator):

try {
  Invoke-Command -ErrorAction Stop -ComputerName $computer {

    # Define wildcard-based path.
    $keyPath = "registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\AppV\MAV\Configuration\Packages\*\UserConfigEx\$SID"

    # See if it matches any keys.
    if (Test-Path $keyPath) {
      # Note: I'm assuming you want to remove the entire *key*.
      #       To only remove a key's *value*, use Remove-ItemProperty.
      Remove-Item -Path $keyPath
    } else {
      Write-Warning "No keys with SID $SID exist."
    }

  }

} catch [System.Management.Automation.Remoting.PSRemotingTransportException] {
  # Note: Depending on the specifics of your Invoke-Command call, the reason may
  #       be permissions-related; when in doubt, examine $_
  Write-Warning "Unable to connect to $computer. Please ensure correct computer name / IP address has been entered correctly:`n$_"
} catch {
  # Other, unexpected failure.
  Throw
}
0 голосов
/ 24 мая 2018

Похоже, проблема в кавычках ascii vs unicode:

У вас есть:

$regkey.GetValue(“$SID”)

, которую следует заменить на:

$regkey.GetValue("$SID")
...