ConfigMgr Client Baseline Evaluierung starten

 

Hier eine sehr einfach Funktion für einen WMI Trigger:

Wofür dieses Script?

ZB. pendente Reboots. Sollte die Evaluierung um 11:00 Uhr laufen und das Gerät einen Reboot um 11:01 durchfüren, wird die nächste Evaluierung ungefähr 24h später, also wieder ca. um 11:00 Uhr durchgeführt. Die Compliance für die Baseline bleibt solange auf non-compliant.

Powershell: Metric der Ethernet Karte einstellen

Die Metrik der Ethernet Karte kann über Powershell bzw. Netsh recht einfach verändert werden. Windows verwendet hier eine automatische Metrik als Standard-Einstellung. Nicht immer ist das die beste Lösung. Über die Metrik der Netzwerk-Karte wird die Priorisierung des Datenfluss gesteuert. Ein hoher Wert gibt eine niedrige Priorität an. Werte von 1 – 50 können automatisch more

Powershell: Alle Sites von CAS extrahieren

Kurz und knackig:

Get-WmiObject -ComputerName '[Server-Name]' -Class 'SMS_SiteANDSubsites' -Namespace 'root\SMS\site_[Site-Code]' | 
    Select-Object ServerName, SiteName, SiteCode | 
    Export-Csv -Path C:\Temp\CM_Sites.csv
    
    
    

Natürlich müssen Server Namen und Site-Code geändert werden. Der Pfad für die CSV Datei kann, muss aber nicht gewählt werden.

Powershell: WMI Abfrage auf Sites in ConfigMgr 2012

Einfach den Server-Namen, SiteCode, Filter-Text anpassen und läuft.

$ServerName = <ServerName>
$SiteCode = <SiteCode>
$NameFilter = '<Naming Filter>'

Get-WmiObject -ComputerName $ServerName -Namespace "root\SMS\site_$SiteCode" -Class 'SMS_Site' -Filter "SiteName  like '%$NameFilter%'" | Select-Object SiteName, ServerName | Export-Csv -Path c:\temp\secsites.csv 


Könnte natürlich auch noch als Funktion ausgebaut werden. Für eine Quick-And-Dirty Anwendung reicht das sicher so.

Powershell: SQL Edition und Version live abfragen

In einer Hierarchie mit mehr als 70 Siteservern einer ConfigMgr 2012 R2 Umgebung stellt sich vielleicht mal die Frage der verwendeten Editionen und deren Versionen. Basierend auf einer schon früher veröffentlichten SQL Query Abfrage habe ich dann folgendes kurzes Script erstellt: Das Script holt sich aus der WMI des Servers eine Liste aller SiteServer (CAS more

Powershell: Pending Reboots in Sharepoint Liste

Aus der Notwendigkeit raus, Pending Reboots zu reporten hab ich folgendes Script entwickelt. Basis des Scripts ist eine Baseline, die die Pending Reboots, aufgrund verschiedener Tatsachen, in die CM12 Datenbank bringt. Die Compliance Daten können dann mit Hilfe dieses Scripts in eine Sharepoint Liste übertragen werden und damit als Historie verwendet werden. Die Baseline muss more

Powershell: Active Directory Gruppe Monitoren

Wie oft ist es schon passiert, dass sich Administratoren die Frage stellen, seit wann ein Account, eine Gruppe, effektive eine Person(engruppe) die Vorzüge oder Einschränkungen hinter einer Active Directory Security Group bekommt.

Nun dafür gibt es eine einfache Lösung:

Import-Module ActiveDirectory
#Variables
#Variable for AD group to be checked
$CheckGroup = 'Group-Name die überwacht werden soll'
$Folder = 'c:\temp\'
$BasePath = $Folder + 'base.txt'
$CompPath = $Folder + 'comp.txt'
#Variable for comparison base
[IO.File]::ReadAllText("C:\temp\base.txt") -replace '\s+\r\n+', "`r`n" | Out-File "C:\temp\base.txt"
$BaseList = get-content C:\temp\base.txt
#variable for change date of AD group
$ChangeDate = (Get-ADGroup -Identity $CheckGroup -Properties *).whenChanged
#variables for email options
$SMTPServerA = "SMTP Server"
$Sender = 'Absender'
$Receipient = 'Empfänger'
#Variable for comparison output
[System.Collections.ArrayList]$output = @()

#create comparison list
(Get-ADGroupMember -Identity $CheckGroup).Name | Out-File c:\temp\comp.txt

#variable for list to compare with base
[IO.File]::ReadAllText("C:\temp\comp.txt") -replace '\s+\r\n+', "`r`n" | Out-File "C:\temp\comp.txt"
$CompList = get-content C:\temp\comp.txt

$Members = Compare-Object -ReferenceObject $BaseList -DifferenceObject $CompList -IncludeEqual

foreach ($Member in $Members)
{
    switch ($Member.SideIndicator)
	{
		'<='
		{
			if ($Member.InputObjet -ne '')
			{
				$result = $Member.InputObject + " has been removed"
				$output.add($result)
			}
		}
		'=>'
		{
			if ($Member.InputObjet -ne '')
			{
				$result = $Member.InputObject + " has been added"
				$output.add($result)
			}
		}
		'=='
		{
		}
	}
}
#Send Email if list changed
If ($output.count -gt 0)
{
	Send-MailMessage -From $Sender -to $Receipient -Subject "Change on Group-Name recognised" -SmtpServer $SMTPServerA -Body "$output</br>'Last ChangeDate: '$ChangeDate" -Priority High -BodyAsHtml
}
#remove baselist
If (Test-Path $BasePath)
{
	Remove-Item $BasePath
}
#make complist new baselist
If (Test-Path $CompPath)
{
	Rename-Item -Path $CompPath -NewName 'base.txt'
}

Dieses Skript als “Scheduled Task” kann schon Licht ins Dunkle bringen.
Klar, es wird noch nicht geklärt, wer die Änderung gemacht hat.

Das ist eine ganz andere Geschichte.

Powershell: Datum der letzen Installation des Betriebssystems / Letzter Neustart

Sehr einfach rauszufinden: Das Datum / Uhrzeit der letzten Installation des Windows Betriebssystems.

$IsDate = Get-WmiObject -class win32_operatingSystem
$IsDate.ConvertToDateTime($IsDate.InstallDate)

Diese Information hilft beim Einschätzen wie lange der Rechner schon auf dem entsprechenden Build läuft.

Analog können natürlich weitere Infos aus der selben WMI Klasse ausgelesen werden, wie zum Beispiel das letzte Datum / Uhrzeit eines Neustarts.

$LastBoot = Get-WmiObject -class win32_operatingSystem
$LastBoot.ConvertToDateTime($LastBoot.LastBootUpTime)

Pendente Neustarts, verursacht durch Software Updates, Software Installationen oder Windows Updates können seltsame Verhalten hervorrufen. Immerhin werden ja auch Module, Dateien und Bibliotheken verändert, welche möglicherweise gerade in Nutzung sind.

 

Powershell / ConfigMgr2012: Non-Persistant Cache löschen

Ein zu kleiner CCM-Cache kann verhindern, dass neue Pakete, die nicht mehr in den Cache geladen werden können, nicht mehr installiert werden. Mit folgendem Snippet kann der Cache geleert werden Die Ursprüngliche Idee war dieses Snippet als Script in ein ConfigMgr Paket einzubinden und vorrangig den Cache zu bereinigen. Folgender Befehl muss dazu genutzt werden more

Powershell: MSI Infos auslesen

Und wieder ein kleines, aber feines, Script, das den IT Alltag versüßen kann.

Hiermit lassen sich wichtig Infos, wie z.B. die Produkt ID einer MSI Datei auslesen.

function get-msiinfo
<#
.SYNOPSIS
funktion to get MSI details
.DESCRIPTION
get ProductCode, ProductVersion, ProductName
.PARAMETER $Path
specifies the path of MSI file
.PARAMETER $Property
Properies can be specified for ProductCode, ProductVersion, ProductName
.EXAMPLE
get-msiinfo -Path C:\temp\file.msi -Property ProductCode
get-msiinfo -Path C:\temp\file.msi -Property ProductVersion
get-msiinfo -Path C:\temp\file.msi -Property ProductName
#>
    {
    [CmdletBinding()]
    param(
        [parameter(Mandatory=$true)]
        [IO.FileInfo]$Path,
        [parameter(Mandatory=$true)]
        [ValidateSet("ProductCode","ProductVersion","ProductName")]
        [string]$Property
        )
    try {    
        $WindowsInstaller = New-Object -ComObject WindowsInstaller.Installer    
        $MSIDatabase = $WindowsInstaller.GetType().InvokeMember("OpenDatabase","InvokeMethod",$Null,$WindowsInstaller,@($Path.FullName,0))    
        $Query = "SELECT Value FROM Property WHERE Property = '$($Property)'"    
        $View = $MSIDatabase.GetType().InvokeMember("OpenView","InvokeMethod",$null,$MSIDatabase,($Query))    
        $View.GetType().InvokeMember("Execute", "InvokeMethod", $null, $View, $null)    
        $Record = $View.GetType().InvokeMember("Fetch","InvokeMethod",$null,$View,$null)    
        $Value = $Record.GetType().InvokeMember("StringData","GetProperty",$null,$Record,1)    
        return $Value
        } 
    catch {    
        Write-Output $_.Exception.Message
        }
    }

Diese Informationen können Installationen und Deinstallationen von MSI’s im Bereich von Software Deployment eine deutliche Erleichterung bedeuten.

Powershell: Computer soll sich selbst zur einer AD Gruppe hinzufügen

Wenn das Active Directory nicht manuelle OU’s für Desktops und Laptops hat, die auch noch akribisch gepflegt werden, gibt es hin und wieder die Notwendigkeit die Computer der Einen oder Anderen Benutzergruppe, also die Rechner der Laptop-Anwender bzw. Desktop Anwender separat zu bedienen. Der Microsoft Configuration Manager macht das recht einfach möglich. Nun kann ich more

Powershell: Active Directory mit Powershell – Einfach und Wirkungsvoll

Active Directory (AD) kann sehr einfach mit Powershell verwaltet werden.

Ein paar einfach Kniffe gibts hier:

Alle AD Objekte ausgeben, die Computer-Objekte sind

Get-ADComputer –Filter {Name –Like "*"}

Alle AD Computer-Objekte die seit 60 Tagen inaktiv sind

Search-ADaccount -AccountInactive -Timespan 60 -ComputersOnly

oder etwas dynamischer um gleich in einer Funktion weiter zu verwenden

$days = 60
$lastLogon = (get-date).adddays(-$days).ToFileTime()
Get-ADComputer -filter {lastLogonTimestamp -gt $lastLogon}

Deaktivierte Computer-Objekte löschen (Achtung! Vorsicht beim Löschen!)

Search-ADAccount -AccountDisabled -ComputersOnly | 
    Sort-Object | 
    Remove-ADComputer

Deaktivierte Computer-Objekte einer spezifischen OU löschen (Achtung! Vorsicht beim Löschen!)

Search-ADAccount -AccountDisabled -Searchbase "OU=OU-Name,DC=Domain,DC=Com" -ComputersOnly | 
    Sort-Object | 
    Remove-ADComputer

 

Weitere CMDlets werde ich noch hinzufügen.

Powershell: Installierte Software ausgeben

Über eine schöne WMI Abfrage kann Software, die auf einem Rechner installiert ist ausgegeben werden:

Get-WmiObject -Class Win32_Product | Select-Object -Property Name, Vendor, Version

Diese Basis kann einfach auch noch gefiltert werden um nur anzuzeigen, was wirklich gesucht wird.

Get-WmiObject -Class Win32_Product | 
    Select-Object -Property Name, Vendor, Version | 
    Where-Object Name -Like '*Software Name*'

 

Viel Spass beim herumprobieren!

 

Powershell: Funktion erstellen

Funktionen sind leicht wiederverwertbar und empfehlen sich sehr für Wiederverwendbarkeit.

Wichtig ist eine saubere Dokumentation, Kommentierung und Verwendung von Parametern.

Function Run-Function
{
<#
.SYNOPSIS
function information
.DESCRIPTION
function description
.PARAMETER $Parameter
parameter description
.EXAMPLE
Run-Function -PARAMETER 'Value'
#>
[CmdletBinding()]
Param
(
    [Parameter(Mandatory=$true)]
    [string]$Parameter1,
    [Parameter(Mandatory=$false)]
    [string]$Parameter2,
)
    
#Function Algorithm 

   
}

Powershell: Veraltete Computer in Excel exportieren

Mit diesem Script wird ein Export aus dem Active Directory erstellt. Mit den Parametern können die Rahmenbedingungen für den Export festgelegt werden

function Get-OutdatedComputer
{
[CmdletBinding()]
Param
(
    [Parameter(Mandatory=$true)]
    [string]$Path,
    [Parameter(Mandatory=$true)]
    [int]$Age,
    [Parameter(Mandatory=$true)]
    [string]$OU    
)
[int]$ComputerPasswordAgeDays = $Age
IF ((test-path "$Path") -eq $False) { md "$Path" }
$ExportFile = "$Path\$OU-InactiveWorkstations.csv"
$ComputerStaleDate = (Get-Date).AddDays(-$ComputerPasswordAgeDays)
$InactiveWorkstations = Get-ADComputer -filter { (passwordLastSet -le $ComputerStaleDate) -and (OperatingSystem -notlike "*Server*") -and (OperatingSystem -like "*Windows*") } -properties Name, DistinguishedName, OperatingSystem,OperatingSystemServicePack, passwordLastSet,LastLogonDate,Description | Where { $_.DistinguishedName -like "*Computer*" } | where { $_.DistinguishedName -like "*OU=$OU,*" }  #| where { $_.DNSHostName -like "$OU.*" }
$InactiveWorkstations | export-csv $ExportFile -Delimiter ';'  
}

Mein Nutzen daraus ist ist ganz klar der Clean-Up-Gedanke.