Ir al contenido principal

PowerShell script to list all installed Microsoft Windows Updates

Fuente: https://gallery.technet.microsoft.com/scriptcenter/PowerShell-script-to-list-0955fe87


Why use this script?
The PowerShell cmdlet 'get-hotfix' sometimes does not draw-out 'installedon' information. win32-Quickfixengineering class does not have that information either.

What does this script offer?
The above void can be filled by using the good old 'wmic qfe list' command. But, the output of the legacy command is mere text and cannot be easily interrogated like objects in PowerShell. 
The attached script converts the output string of 'wmic qfe list' command into versatile PowerShell objects, which can be used within other scripts.

Note: Do not forget to include the attached powershell script.

The below POSH oneliner lists all updates installed in the last 2 days and tabulates properties: Computername, KBArticle,InstalledOn, HotFixID and InstalledBy.
PowerShell
Get-MSHotfix|Where-Object {$_.Installedon -gt ((Get-Date).Adddays(-2))}|Select-Object -Property Computername, KBArticle,InstalledOn, HotFixID, InstalledBy|Format-Table
The below powershell command-line will output details about the hotfix with ID '2953522'.
PowerShell
Get-MSHotfix|Where-Object {$_.HotfixID -match "KB2953522"}
 The below POSH gem opens the Knowledge Base webpage for the hotfix with ID '2953522'.
PowerShell
Get-MSHotfix|Where-Object {$_.HotfixID -match "KB2953522"}|ForEach-Object {[System.Diagnostics.Process]::Start($_.KBArticle)}
 Script content:
PowerShell
Function Get-MSHotfix 
{ 
    $outputs = Invoke-Expression "wmic qfe list" 
    $outputs = $outputs[1..($outputs.length)] 
     
     
    foreach ($output in $Outputs) { 
        if ($output) { 
            $output = $output -replace 'y U','y-U' 
            $output = $output -replace 'NT A','NT-A' 
            $output = $output -replace '\s+',' ' 
            $parts = $output -split ' ' 
            if ($parts[5] -like "*/*/*") { 
                $Dateis = [datetime]::ParseExact($parts[5], '%M/%d/yyyy',[Globalization.cultureinfo]::GetCultureInfo("en-US").DateTimeFormat) 
            } else { 
                $Dateis = get-date([DateTime][Convert]::ToInt64("$parts[5]", 16))-Format '%M/%d/yyyy' 
            } 
            New-Object -Type PSObject -Property @{ 
                KBArticle = [string]$parts[0] 
                Computername = [string]$parts[1] 
                Description = [string]$parts[2] 
                FixComments = [string]$parts[6] 
                HotFixID = [string]$parts[3] 
                InstalledOn = Get-Date($Dateis)-format "dddd d MMMM yyyy" 
                InstalledBy = [string]$parts[4] 
                InstallDate = [string]$parts[7] 
                Name = [string]$parts[8] 
                ServicePackInEffect = [string]$parts[9] 
                Status = [string]$parts[10] 
            } 
        } 
    } 
} 
The following script can be used as a template to run this function against multiple machines. For this to work you have to enable PSRemoting on all the machines.
PowerShell
$scriptDirectory = Split-Path -Parent $MyInvocation.MyCommand.Definition 
."$scriptDirectory\Get-MSHotfix.ps1" 
$allUpdates = '' 
$array = @("host1""host2""host3"for ($i=0; $i -lt $array.length; $i++) { 
$Updates = Invoke-Command -ComputerName $array[$i${function:Get-MSHotfix}|ft -HideTableHeaders 
$allUpdates +$Updates 
} 
$allUpdates

Further notes:

As mentioned above the get-hotfix cmdlet and get-wmiobject -class win32_quickfixengineering command does not output the 'installedon' date for some updates. The reason for which I'm yet to find out. 

Output of the 'get-wmiobject -class win32_quickfixengineering' command: InstalledOn property NOT available for all updates.


Output of the 'wmic qfe list' command: Installedon property available for all updates.


Output of Get-MSHotfix:

Comentarios

Entradas populares de este blog

Get SharePoint Online Site and SubSites permission using PowerShell

The below PowerShell script retrieves the following for the given SharePoint Online Site All the Sub-site's URL Security group attached with each Sub-site with their permission level Prerequisites: This PowerShell script uses the latest version of SharePoint Online PnP Module. Download the installer from https://github.com/SharePoint/PnP-PowerShell/releases  Install-Module SharePointPnPPowerShellOnline  Install-Module - Name ' SharePointPnP.PowerShell.Commands.Files.Recurse ' function  connect - site( $webs , $creds ){    Connect - PNPonline  - Url  $webs   - Credentials  $cred     }    function  get - sitepermission( $web , $cred ){    $rec =@()    connect - site  - webs  $web   - creds  $cred     if ( $web   - eq  $parentsitename )  {  #Write-Host "Parent site permission" $web   $Pgroups =Get - PNPGroup  foreach ( $Pgroup   in   $Pgroups )  {  $DLGP  =  ""   |   Select   "SiteUrl" , "GroupName" , "Permiss

Find and Delete Orphaned Users in SharePoint

Fuente: http://www.sharepointdiary.com/2012/09/find-and-delete-orphaned-users-in-sharepoint.html Orphaned User? Who are they? Orphaned users are those who have been disabled/removed from Active Directory, but still have permissions to sites, lists and items. Internally, SharePoint keeps them in " UserInfo " table of the content database for meta-data such as created/modified by fields. Its unavoidable in any organization where employees constantly on-boarding and off-boarding. Its really difficult to manage, when it comes to thousands of sub-sites, sites, libraries and lists with their own sets of permissions. Why we care about Orphaned users? It is a best practice to delete orphaned users to keep the farm clean & organized. Also this will solve the problem of deleted active directory users still appearing on the people picker which was discussed here  People Picker not showing users from Active Directory? . If you know the user base or criteria then you can use: Clea

Conexión desde casa a una VPN sin perder salida a internet

Solución, asumiendo que estas en Windows: Panel de Control, Conexiones de Red. Clic derecho en la VPN, dale a propiedades. Anda a la pestaña de "Funciones de Red" y selecciona Protocolo Internet TCP/IP y clic en el botón "Propiedades". Ahora hazle clic al botón "Opciones Avanzadas..."En la pestaña "General", desmarca la opción que dice "Usar la puerta de enlace predeterminada en la red remota". Dale a aceptar a todas las ventanitas de opción, y ahora conéctate a la VPN nuevamente. Con eso deberías entrar a la VPN sin perder la conexión local de tu red e internet.