powershell
  • foreach
  • null
  • enterprise
  • symantec
  • 2017-01-11 18 views 0 likes 
    0

    У меня есть много серверов, с которых мне нужно удалить Symantec Endpoint Protection. Я связался с Symantec и получил код ниже:Удалить Symantec Endpoint Protection в среде предприятия

    (Get-WmiObject -Class Win32_Product -Filter "Name='Symantec Endpoint Protection'" -ComputerName xxxxxx).Uninstall() 
    

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

    You cannot call a method on a null-valued expression. 
    At line:1 char:1 
    + (Get-WmiObject -Class Win32_Product -Filter "Name='Symantec Endpoint Protection' ... 
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
        + CategoryInfo          : InvalidOperation: (:) [], RuntimeException 
        + FullyQualifiedErrorId : InvokeMethodOnNull

    Ничто не изменилось с момента, когда я начал, и я пытаюсь выяснить, что означает, что выше ошибка. Кроме того, если я могу заставить это работать, кто-нибудь видит способ добавить много серверов в команду foreach или что-то в этом роде.

    +0

    'Get-WmiObject' не возвращает результат, поэтому вы пытаетесь вызвать' Uninstall() 'на нулевом значении. Вы можете избежать ошибки следующим образом: 'Get-WmiObject ... | ForEach-Object {$ _. Uninstall()} ' –

    ответ

    0

    Две вещи с моей стороны:

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

    2) В вашем случае «Имя =« Защита конечной точки Symantec »« отчетов Null для вас, что означает, что этого значения нет. Пожалуйста, проверьте правильное имя.

    Для лучшей производительности и в качестве части расширения вы должны использовать реестр для получения сведений.

    Function Get-RemoteSoftware{ 
    <# 
    .SYNOPSIS 
    Displays all software listed in the registry on a given computer. 
    
    .DESCRIPTION 
    Uses the SOFTWARE registry keys (both 32 and 64bit) to list the name, version, vendor, and uninstall string for each software entry on a given computer. 
    
    .EXAMPLE 
    C:\PS> Get-RemoteSoftware -ComputerName SERVER1 
    This shows the software installed on SERVER1. 
    #> 
    
    param (
        [Parameter(mandatory=$true,ValueFromPipelineByPropertyName=$true)][string[]] 
        # Specifies the computer name to connect to 
        $ComputerName 
    ) 
    
    Process { 
        foreach ($Computer in $ComputerName) 
        { 
         #Open Remote Base 
         $reg=[microsoft.win32.registrykey]::OpenRemoteBaseKey('LocalMachine',$Computer) 
    
         #Check if it's got 64bit regkeys 
         $keyRootSoftware = $reg.OpenSubKey("SOFTWARE") 
         [bool]$is64 = ($keyRootSoftware.GetSubKeyNames() | ? {$_ -eq 'WOW6432Node'} | Measure-Object).Count 
         $keyRootSoftware.Close() 
    
         #Get all of they keys into a list 
         $softwareKeys = @() 
         if ($is64){ 
          $pathUninstall64 = "SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall" 
          $keyUninstall64 = $reg.OpenSubKey($pathUninstall64) 
          $keyUninstall64.GetSubKeyNames() | % { 
           $softwareKeys += $pathUninstall64 + "\\" + $_ 
          } 
          $keyUninstall64.Close() 
         } 
         $pathUninstall32 = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall" 
         $keyUninstall32 = $reg.OpenSubKey($pathUninstall32) 
         $keyUninstall32.GetSubKeyNames() | % { 
          $softwareKeys += $pathUninstall32 + "\\" + $_ 
         } 
         $keyUninstall32.Close() 
    
         #Get information from all the keys 
         $softwareKeys | % { 
          $subkey=$reg.OpenSubKey($_) 
          if ($subkey.GetValue("DisplayName")){ 
           $installDate = $null 
           if ($subkey.GetValue("InstallDate") -match "/"){ 
            $installDate = Get-Date $subkey.GetValue("InstallDate") 
           } 
           elseif ($subkey.GetValue("InstallDate").length -eq 8){ 
            $installDate = Get-Date $subkey.GetValue("InstallDate").Insert(6,".").Insert(4,".") 
           } 
           New-Object PSObject -Property @{ 
            ComputerName = $Computer 
            Name = $subkey.GetValue("DisplayName") 
            Version = $subKey.GetValue("DisplayVersion") 
            Vendor = $subkey.GetValue("Publisher") 
            UninstallString = $subkey.GetValue("UninstallString") 
            InstallDate = $installDate 
           } 
          } 
    
          $subkey.Close() 
         } 
         $reg.Close() 
        } 
    } 
    
    } 
    

    Примечание: Используйте функцию или запрос внутри функции, чтобы получить результат.

    Надеюсь, это поможет.

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

    • Нет связанных вопросов^_^