Nachinstallation von .Net 3.5

Die Installation von .NET 3.5 ist eine echte Herausforderung:
Trotz Internetanbindung schlägt das Nachladen meist fehl.

Die einfachste variante ist, meiner Meinung nach, das einlegend der DVD und dann die Offline-Installation per DISM:

DISM /Online /Enable-Feature /FeatureName:NetFx3 /All /LimitAccess /Source:f:\sources\sxs

Die Option „LimitAccess“ sorgt dafür, dass kein Kontakt zum Internet aufgenommen wird.

Der Pfad bei „Source“ muss mit dem korrekten Laufwerksbuchstaben versehen werden!

 

Exchange Monitoring (ver 1.2.2)

Einfaches Monitoring von einer Exchange-Umgebung ( Jetzt auch für Exhcange 2013/6 )

Folgendes wird überprüft:

  • Dienst die auf Automatisches Starten eingestellt sind
  • Festplatten (leerer Speicherplatz)
  • Queues
  • Clusterresourcen
    • Dieser Test wird nur noch durchgeführt, wenn die entsprechende Rolle auf dem lokalem System installiert ist.
  • Zertifikate (Ablaufdatum)

„Exchange Monitoring (ver 1.2.2)“ weiterlesen

Mailbox-Datenbank leer räumen

Es gibt unterschiedliche Szenarien in denen eine Datenbank ausgedient hat:

  • Volume ist voll
  • Änderung der Namenskonvention
  • Änderung der Struktur wie z.B. eine DB pro Abteilung oder Standort

Seit Exchange 2010 ist es auf alle Fälle möglich ein Postfach in eine andere Datenbank zu verschieben, ohne dass der Benutzer gestört wird.

Ein Verschieben der Datenbank ist ohne Down-Time nicht möglich. Daher empfehle stat desse nimmer eine neue DB zu erstellen und die Mailboxen zu verschieben.

Mit den folgenden 3 Zeilen PowerShell-Code werden alle Postfächer von einer DB in eine andere geschoben.

Das ganze ist als Beispiel gedacht!

Die alte DB heisst „Mailbox Database 1507976970“

Die neue DB hat den Namen „Mail-01“

Get-MailboxDatabase "Mailbox Database 1507976970" | Get-Mailbox | New-MoveRequest -TargetDatabase Mail-01
Get-MailboxDatabase "Mailbox Database 1507976970" | Get-Mailbox -Archiv | New-MoveRequest -TargetDatabase Mail-01
Get-MailboxDatabase "Mailbox Database 1507976970" | Get-Mailbox -Arbitration | New-MoveRequest -TargetDatabase Mail-01

 

 

WMI-Filter testen

In Gruppenrichtlinien kommen häufig WMI-Filter zum Einsatz.

Mit dem CMDlet Get-WMIObject kann man auf jedem PC, auf dem Power Shell läuft, die WMI-Filter testen. Am besten auf dem PC auf dem die Filter wirken sollen.

Hinweis: WMI-Filter von GPOs werden auf dem Client ausgeführt und das Ergebnis entscheidet ob die Richtlinie angewendet wird oder nicht.
WMI-Filter benötigen somit Ressourcen vom Client und der Server muss auf das Ergebnis warten. Wie immer gilt: Verwendung in maßen und nicht in Massen!

Hier ein Beispiel mit Ausgabe:

PS C:\Users\rob> Get-WmiObject -Query "select * from Win32_ComputerSystem where PCSystemType = 3"


Domain              : PowerShell.PUB
Manufacturer        : Gigabyte Technology Co., Ltd.
Model               : To be filled by O.E.M.
Name                : PC-1
PrimaryOwnerName    : administrator
TotalPhysicalMemory : 16999178240

Eine Ausgabe bedeutet TRUE und wenn nichts ausgegeben wurde ist das Ergebnis FALSE

Hier noch ein hilfreicher Link: https://technet.microsoft.com/en-us/library/jj717288.aspx

NTFS-Change Permissions

Die normalen Änderungsrechte auf ein Verzeichnis geben meist zu viele Rechte. Der Benutzer ist dadurch in der Lage das Verzeichnis zu löschen, umzubenennen oder zu verschieben.

Als Administrator möchte man das meist nicht und die Änderungen passiert meist auch nicht mit Absicht. Schnell die Maus über die Liste der Verzeichnisse bewegt und dabei versehentlich die linke Taste kurz ausgelöst. Schon ist ein Verzeichnis verschoben und es fällt erst mal nicht auf…

Die Rechte anzupassen ist dabei nicht Aufwendig:

  1. Eigenschaften des Verzeichnisses öffnen
  2. Den Tab „Sicherheit“ anklicken
  3. Auf den Button „Erweitert“ im Fenster unten rechts klicken
  4. Den betroffenen Benutzer oder Gruppe auswählen und auf „Ändern“ klicken
  5. Bei Windows 8 und 8.1 muss man nun noch den Link „Erweiterte Berechtigungen anzeigen“ anklicken
  6. Berechtigung wie im Bild vergeben. Markiert sind die Optionen die geändert wurden gegenüber den Änderungsrechten.

FolderPerm

 

…und dies wäre nicht „PowerShell.PUB“ wenn es kein Script dafür geben würde:

Wenn Sie auf das Verzeichnis C:\Daten folgende Rechte vergeben möchten:

  • Vollzugriff für SYSTEM
  • Vollzugriff für lokale Admins
  • Änderungsrechte für Benutzer (unterhalb des Verzeichnisses

Folgender Einzeiler erledigt das für Sie:

icacls c:\Daten /inheritance:r /grant *S-1-5-32-544:(OI)(CI)(F) /grant *S-1-5-18:(OI)(CI)(F) /grant *S-1-5-32-545:(OI)(CI)(RX,W,DC)

Es wir mit SIDs gearbeitet, da diese international funktionieren. Umlaute und andere Sonderzeichen erzeugen manchmal Probleme.

Lokales System: S-1-5-32-18
Lokaler Admin: S-1-5-32-544
Lokaler Benutzer: S-1-5-32-545

Die restlichen well known SIDs können Sie hier finden: https://support.microsoft.com/kb/243330

MAC-Authentifizierung

In manchen Fällen benötigt man Accounts für Netzwerkgeräte die per Radius (802.1x) im Netz authentifiziert werden sollen. Mit folgendem Skript können einzelne Geräte per Parameter oder mehrere per CSV-Datei erstellt werden.

#------------------------------------------------------------------------------#
# Skript zum erstellen von Accouts für Netzwerkgeräte die über den Radius per 
# MAC-Adresse authentifiziert werden müssen
# Autor: Rob   	        8.8.2013
#------------------------------------------------------------------------------#
# Changelog:
# Datum			Änderung
# 	
#------------------------------------------------------------------------------#
param
	(
	[string]$File,
	[string]$Name,
	[string]$MAC,
	[string]$OU="MACAUTH",
	[string]$DN="OU=Clients,DC=MyDomain,DC=Local",
	[string]$Gruppe="MACAUTH_CLIENT",
	[switch]$DEBUG
	)
#------------------------------------------------------------------------------#
# Die Datei muss ein CSV-File mit folgender Struktur sein:
#------------------------------------------------------------------------------#
# Name,MAC,OU,Gruppe
# Tel0005,081508150818,XYZ,MACAUTH_CLIENT
#------------------------------------------------------------------------------#
 
#region Script Diagnostic Functions 
 
function Get-CurrentLineNumber {
    $MyInvocation.ScriptLineNumber
}
 
New-Alias -Name __LINE__ -Value Get-CurrentLineNumber –Description ‘Returns the current line number in a PowerShell script file.‘
 
function Get-CurrentFileName {
    $MyInvocation.ScriptName
}
 
New-Alias -Name __FILE__ -Value Get-CurrentFileName -Description ‘Returns the name of the current PowerShell script file.‘
 
#endregion
 
 
 
$error.clear()	# Fehlerbehandlung
 
if ( $File -eq "" )	# Keine Datei Angegeeben
	{
	if ( $Debug ) { Write-host "No File" }
	if ( $MAC -eq "" -or $Name -eq "" ) # Beide müssen angegeben sein
		{
		Write-warning "$(__Line__): Es muss entweder eine Datei oder Name und MAC-Adresse angegeben werden!"
		exit
		}
	else	# MAC prüfen
		{
		$MAC = $MAC -replace "([^a-f0-9])"
		if ( $MAC.Length -ne 12 )
			{
			write-warning "$(__Line__): MAC Adresse ungültig bei $Name ( $MAC )"
			exit
			}
		}
	$Accounts = ""
	$Accounts = $Accounts | add-member -membertype noteproperty -name MAC -value $MAC -passthru
	$Accounts = $Accounts | add-member -membertype noteproperty -name Name -value $Name -passthru
	if ( $Gruppe -ne "" )
		{
		if ( $Debug ) { write-host "Gruppe per Komandozeile:" $Gruppe }
		$Accounts = $Accounts | add-member -membertype noteproperty -name Gruppe -value $Gruppe -passthru
		}
	}
else					# Datei angegeben
	{
	if ( $MAC -ne "" -or $Name -ne "" ) # Keiner darf angegeben sein
		{
		Write-warning "$(__Line__): Es muss entweder eine Datei oder Name und MAC-Adresse angegeben werden!"
		exit
		}
	if ( -not (test-path $file) )
		{
		write-warning "$(__Line__): Gültigen Dateinamen angeben!"
		exit
		}
	$TMP1 = get-content $file
	if ( $TMP1.count -lt 1 )
		{
		write-warning "$(__Line__): Die Datei ist leer oder nicht lesbar"
		exit
		}
	Remove-Item $file -force -confirm:$false
	foreach ( $TMP2 in $TMP1 )
		{
		$TMP2 = $TMP2.trim()
		if ( $TMP2.length -ne 0 )
			{
			$TMP2 | out-file -FilePath $file -Append
			}
		}
 
	$Accounts = import-csv $file -Delimiter "`t" | Select @{Name="Name";Expression={$_."Hostname"}}, @{Name="MAC";Expression={$_."MAC-Adresse"}}, @{Name="OU";Expression={$_."AD-OU"}}
	}
 
if ( $error.count -ne 0 )
	{
	write-warning "$(__Line__): Abbruch wegen Fehler!"
	exit
	}
 
foreach ( $Account in $Accounts )
	{
	$MAC = $Account.MAC -replace "([^a-f0-9])"
	$Name = $Account.Name
	if ( $Debug ) { write-host $Name `t $MAC }
	if ( $MAC.Length -ne 12 )
		{
 
		write-warning "$(__Line__): MAC Adresse ungültig bei $Name ( $MAC )"
		exit
		}
 
	$Probe = Get-ADUser -Filter { (SamAccountName -eq $MAC ) -or (Name -eq $Name) -or (DisplayName -eq $Name)}
	if (( $Probe | measure).count -ne 0 )
		{
		write-warning "$(__Line__): Ein Objekt mit dem Namen $Name oder $MAC existiert bereits!"
		if ( $file -ne "" ) { Write-warning "Es wurde kein neuer Account angelegt!" }
		write-host "Vorhandenes Objekt:" $Probe
		exit
		}
	}
 
foreach ( $Account in $Accounts )
	{
	$MAC = $Account.MAC.toupper() -replace "([^a-f0-9])"
	$Name = $Account.Name
	$PWD = ConvertTo-SecureString -String $MAC.tolower() -asplaintext -force
	if ( $Account.OU )
		{
		$MACDN = "OU=" + $Account.OU + "," + $DN
		}
	else
		{
		$MACDN = $DN
		}
	$Probe = ( Get-ADObject -Filter { ( DistinguishedName -eq $MACDN ) } )
	if ( ( $Probe | measure).count -eq 0 )
		{
		write-warning "$(__Line__): Der Distinguished Name ( $MACDN ) ist ungültig!"
		exit
		}
	$TMP1 = "OU=" + $OU + "," + $MACDN
	$Probe = ( Get-ADObject -Filter { ( DistinguishedName -eq $TMP1 ) } )
	if ( ( $Probe | measure).count -eq 0 )
		{
		New-ADOrganizationalUnit -Name $OU -Path $MACDN -ProtectedFromAccidentalDeletion $true -Description "Objekte die per MAC authentifiziert werden: Drucker oder Apple Mac"
		}
	$MACDN = $TMP1
	if ( $Debug ) { write-host "DN:" $MACDN }
	if ( $error.count -ne 0 )
		{
		write-warning "$(__Line__): Abbruch wegen Fehler!"
		exit
		}
 
	New-ADuser -Enabled $true -PasswordNeverExpires $true -AllowReversiblePasswordEncryption $true -CannotChangePassword $true -Path $MACDN -SamAccountName $MAC -DisplayName $Name -Name $Name -AccountPassword $PWD
	$MACDN = ( Get-ADUser $MAC ).DistinguishedName
	if ( $error.count -ne 0 )
		{
		write-warning "$(__Line__): Abbruch wegen Fehler!"
		write-warning "Accout: $MAC `t DN: $MACDN"
		exit
		}
 
	if ( -not $Gruppe )
		{
		$Gruppe = $Account.Gruppe
		}
	if ( $Debug ) { write-host "Gruppe:" $Gruppe }
	$SID = (((Get-ADGroup $Gruppe).SID).Value.tostring())
	$SID = $SID.substring($SID.LastIndexOf("-")+1)
	if ( $Debug ) { write-host $Gruppe `t $SID }
	if ( $error.count -ne 0 )
		{
		write-warning "$(__Line__): Abbruch wegen Fehler!"
		exit
		}
	Add-ADGroupMember $Gruppe $MAC
	Set-ADObject -Identity $MACDN -Replace @{primaryGroupID="$SID"}
 
	sleep 1
	Remove-ADGroupmember "Domänen-Benutzer" -Member $MAC -confirm:$false
 
	if ( $error.count -ne 0 )
		{
		write-warning "$(__Line__): Abbruch wegen Fehler!"
		exit
		}
	}

 

Zertifikate nach PEM (ascii) konvertieren

Zertifikate aus einer Windows Zertifizierungsstelle die mit privatem Schlüssel exportiert werden, sind im pkcs12 Format. Mit hilfe von OPENSSL kann man den Privaten Schlüssel und der Zertifikat exportieren (d.h. jeweils in eine Datei speichern) und in das PEM-Format konvertieren:

Export private Key: openssl pkcs12 -in windows-cert.pfx -out priv-key.pem -nodes -nocerts

Export certificate: openssl pkcs12 -in windows-cert.pfx -out cert.pem -nodes -nokeys

SAN-Zertifikate von eigener CA

SAN-Zertifikate
Um Zertifikate zu erstellen die für mehrere Namen gültig sind, muß man die Zertifikatsstelle dafür konfigurieren. Das geht mit folgender Befehlsfolge:

certutil -setreg policy\EditFlags +EDITF_ATTRIBUTESUBJECTALTNAME2
net stop certsvc
net start certsvc

Bei dem Request muß dann im Feld Attribute die Namesliste angegeben werden:

SAN:dns=servername.mydomain.com&dns=servername&dns=phones&dns=phones.mydomain.com

WINSXS verkleinern

Bei den aktuellen Betriebssystemen von Microsoft wurde das Patchmanagemen etwas verändert. Unter Windows XP wurden die Unsinstall-FIles unter c:\Windows abgelegt. Diese konnten meist einfach gelöscht werden da die Updates meist gar nicht deinstallierbar waren. Ab Vista wurde das WINSXS-Verzeichnis eingeführt. Hier werden Versions-Historien geführt. Dies kann und sollte man nicht einfach löschen! Mit Vista will ich mich auf dieser Seite nicht beschäftigen… Das WINSXS-Verzeichnis wird auf Dauer ziemlich groß und kann somit durchaus ein anfangs großzügig ausgelegtes C: zum überlaufen bringen 🙁

Mit folgendem Befehl kann mann zumindest Dateien löschen lassen, die Seit SP1 überflüssig geworden sind. Dies habe ich unter Windos 7 und Windows 2008 R2 erfolgreich durchgeführt.

dism /online /cleanup-image /spsuperseded

Quelle: How to reclaim space after applying Windows 7/2008 R2 Service Pack 1