So synchronisieren Sie Ihre Active Directory-Computer mit WSUS und Lansweeper

So synchronisieren Sie Ihre Active Directory-Computer mit WSUS und Lansweeper
Bildrechte: Marco Griep (CC BY-NC-ND)

Jeder Systemadministrator weiß es - Mitarbeiter kommen oder verlassen das Unternehmen und das Active Directory muss sorgfältig gewartet werden, sonst weiß niemand, welche Computer und Benutzer noch benötigt werden und welche bereits veraltet sind oder vielleicht nur allgemein. Wenn Sie dann überlegen, einen Computer aus dem Active Directory zu entfernen, verbleiben die Objekte häufig in anderen Systemen wie WSUS oder Lansweeper. Die einzige Möglichkeit, dies zu vermeiden, besteht in der Einführung von Prozessen - im Idealfall natürlich in IT-basierten Prozessen, die das Entfernen der Computerobjekte übernehmen.


Im Lansweeper können Sie die AD-Synchronisation aktivieren, um das Problem zu vermeiden. Wie gehe ich mit dem WSUS um? Was tun, wenn die Anzahl der Computer auf den Systemen bereits unterschiedlich ist? Dann gibt es nur noch den Weg, es aufzuräumen. Natürlich kann ich einen Bericht über alle Systeme erstellen, aber das Sortieren der Computer in drei verschiedenen Berichten ist mühsam. Es wäre viel besser, alle Computer in einem Bericht für alle drei Systeme zu haben.

Ich habe ein PowerShell-Skript geschrieben, das genau das für Sie erledigt.

Sie benötigen das für das PowerShell-Skript

  • Installierte Active Directory-Tools (RSAT für Directory Services) (Importmodule Active Directory)
  • Administratorrechte auf dem WSUS-Server (sowohl WSUS als auch Downstream-Server sind möglich)
  • Mein OpenSource-Tool: API-Lansweeper installiert

Das PowerShell-Skript erklärt

Das PowerShell-Skript ist in drei Abschnitte unterteilt. Zunächst wird das Active Directory PowerShell-Modul geladen, um alle AD-Computerobjekte zu ermitteln. Im zweiten Schritt wird die Lansweeper-API (muss zusätzlich installiert werden) abgefragt und die Computer-Assets ermittelt. Redundante Computer werden in der for-Schleife aussortiert. Passen Sie hier die URL Ihrer API Lansweeper-Installation an (localhost: 85).

Im letzten Schritt werden alle WSUS-Computerobjekte abgefragt. Passen Sie hier die Verbindungsinformationen zu Ihrem WSUS-Server an. Wenn Sie einen Downstream-Server über SSL abfragen, müssen Sie nur den Hostnamen eingeben. Andernfalls überprüfen Sie Port und SSL ($ True). Im letzten Schritt werden alle gesammelten Informationen für Sie zusammengefasst und in einem Raster ausgegeben. Alternativ können Sie auch Export-CSV oder Export-Excel verwenden (ImportExcel-Modul erforderlich).

Das PowerShell Script

#Get-WindowsCapability -Online | ? {$_.Name -like "*RSAT*" -and $_.State -eq "NotPresent"} | Add-WindowsCapability -Online
# Oder:
#DISM /Online /Add-Capability /CapabilityName:Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0
#Install-Module ImportExcel

class HostInfo {
    [string]$Hostname
    [string]$LastSync
}

## Get AD Computers
Import-Module ActiveDirectory
$computers = Get-ADComputer -Filter * -Properties * | select DNSHostName, Created, LastLogonDate, OperatingSystem, IPv4Address, Description

## Get Lansweeper Computers
$response = Invoke-WebRequest -Uri "http://localhost:85/api/Values"  # Enter URL for API Lansweeper here
$data = ConvertFrom-Json $([String]::new($response.Content))

$lansweeper_machines = @()
foreach($d in $data) {
    $obj = @([HostInfo]@{Hostname=$d.AssetName})

    $found = $False
    foreach($entry in $lansweeper_machines) {
        if ($entry.Hostname -eq $obj.Hostname) {
            $found = $True
            break;
        }
    }

    if ($found -ne $True) { $lansweeper_machines += $obj  }
}

## Get WSUS Computers
$srv = [Microsoft.UpdateServices.Administration.AdminProxy]::getUpdateServer("MyWSUS.Domain.Int",$True,8531) # WSUS server. Check SSL and port!
$wsusdata = (Get-WsusComputer -UpdateServer $srv -IncludeDownstreamComputerTargets)
$wsuscomputers = @()

foreach($d in $wsusdata) {
        $comp = $d.FullDomainName.Split('.')[0]
        $obj = @([HostInfo]@{Hostname=$comp;LastSync=$d.LastReportedStatusTime})

        $found = $False
        foreach($entry in $wsuscomputers) {
            if ($entry.Hostname -eq $obj.Hostname) {
                $found = $True
                break;
            }
        }

        if ($found -ne $True) { $wsuscomputers += $obj  }
    }

class OutputData {
    [string]$Hostname = ""
    [string]$Description = ""
    [string]$OS = ""
    [string]$LastLogon = ""
    [boolean]$isInLansweeper = $False
    [boolean]$isInWSUS = $False
    [string]$LastWsusSync = ""
}

$reportData = @()

foreach($comp in $computers) {
    $isInLansweeper = $False
    $isInWSUS = $False
    $splittedName = $comp.DNSHostName.Split('.')[0].ToLower()

    foreach($lscomp in $lansweeper_machines) {
        if ($splittedName -like $lscomp.Hostname.ToLower()) {
            $isInLansweeper= $True
            break;
        }
    }

    foreach($wsuscomp in $wsuscomputers) {
        if ($splittedName -like $wsuscomp.Hostname.ToLower()) {
            $isInWSUS = $True
            $LastWsusSync = $wsuscomp.LastSync
            break;
        }
    }

    $repobj = @([OutputData]@{Hostname=$splittedName;Description=$comp.Description;OS=$comp.OperatingSystem;LastLogon=$comp.LastLogonDate;isInLansweeper=$isInLansweeper;isInWSUS=$isInWSUS;LastWsusSync=$LastWsusSync})

    $reportData += $repobj
}

$reportData | Out-GridView

#$reportData | Export-Excel