Powershell: Windows 11 Bloatware deinstallieren

# Registry-Pfad und Schlüsselname für den Check
$registryPath = "HKLM:\Software\IT und Veranstaltungstechnik Hense\BloadwareRemovalScript"
$registryValue = "ScriptExecuted"

# Überprüfen, ob der Registry-Wert bereits gesetzt ist
if (Test-Path -Path "$registryPath\$registryValue") {
    Write-Host "Das Skript wurde bereits ausgeführt. Beende das Skript."
    exit 0
}

# Liste der Apps, die entfernt werden sollen, einschließlich Cortana
$appsToRemove = @(
    "Microsoft.MicrosoftSolitaireCollection",
    "Microsoft.XboxGameOverlay",
    "Microsoft.XboxGameCallableUI",
    "Microsoft.Xbox.TCUI",
    "Microsoft.XboxApp",
    "Microsoft.XboxGamingOverlay",
    "Microsoft.XboxIdentityProvider",
    "Microsoft.XboxSpeechToTextOverlay",
    "Microsoft.ZuneMusic",
    "Microsoft.ZuneVideo",
    "Microsoft.BingNews",
    "Microsoft.WindowsMaps",
    "Microsoft.People",
    "Microsoft.SkypeApp",
    "Microsoft.OneConnect",
    "Microsoft.WindowsFeedbackHub",
    "Microsoft.Messaging",
    "Microsoft.549981C3F5F10",  # Cortana ID
    "Microsoft.Copilot",
    "MicrosoftTeams", 
    "MicrosoftCorporationII.MicrosoftFamily",
    "Microsoft.OutlookForWindows",
    "Microsoft.MicrosoftOfficeHub", 
    "Microsoft.GetHelp",
    "Microsoft.GamingApp",
    "Microsoft.BingSearch",
    "Microsoft.BingWeather", 
    "Microsoft.BingNews",
    "Microsoft.Getstarted",
    "Microsoft.ZuneMusic",
    "Microsoft.ZuneVideo",
    "Microsoft.WindowsFeedbackHub",
    "microsoft.windowscommunicationsapps"
)

# Vorinstallierte Apps für alle Benutzer durchsuchen und entfernen, wenn sie in der Liste stehen
Get-AppxPackage -AllUsers | ForEach-Object {
    if ($appsToRemove -contains $_.Name) {
        Write-Host "Entferne App: $($_.Name)"
        Remove-AppxPackage -Package $_.PackageFullName -AllUsers
    }
}

# Vorinstallierte System-Apps entfernen, wenn sie in der Liste stehen
Get-AppxProvisionedPackage -Online | ForEach-Object {
    if ($appsToRemove -contains $_.DisplayName) {
        Write-Host "Entferne System-App: $($_.DisplayName)"
        Remove-AppxProvisionedPackage -Online -PackageName $_.PackageName
    }
}

# Nach erfolgreicher Ausführung den Registry-Wert setzen
if (-not (Test-Path -Path $registryPath)) {
    New-Item -Path $registryPath -Force
}
Set-ItemProperty -Path $registryPath -Name $registryValue -Value $true

Write-Host "Das Skript wurde erfolgreich ausgeführt und der Registry-Wert wurde gesetzt."


Winget-AutoUpdate Deutsche GPO

Speicere dieses File unter de-DE auf deinem Domain Controler mit dem namen WAU.adml

<?xml version="1.0" encoding="utf-8"?>
<policyDefinitionResources xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" revision="4.8" schemaVersion="1.0" xmlns="http://schemas.microsoft.com/GroupPolicy/2006/07/PolicyDefinitions">
  <displayName>WinGet-AutoUpdate</displayName>
  <description>WinGet-AutoUpdate GPO-Verwaltung</description>
  <resources>
    <stringTable>
      <string id="WAU">Winget-AutoUpdate</string>
      <string id="SUPPORTED_WAU_1_16_0">Winget-AutoUpdate Version 1.16.0 oder höher</string>
      <string id="SUPPORTED_WAU_1_16_5">Winget-AutoUpdate Version 1.16.5 oder höher</string>
      <string id="ActivateGPOManagement_Name">WAU GPO-Verwaltung aktivieren</string>
      <string id="ActivateGPOManagement_Explain">Diese Richtlinie ist ein überschreibender Schalter für die GPO-Verwaltung von Winget-AutoUpdate.</string>
      <string id="BypassListForUsers_Name">Umgehen der Black/White-Liste für Benutzer</string>
      <string id="BypassListForUsers_Explain">Diese Richtlinie legt fest, ob die Black/White-Liste im Benutzerkontext umgangen wird oder nicht.

Wenn diese Richtlinie deaktiviert oder nicht konfiguriert ist, ist der Standardwert "Nein".</string>
      <string id="DisableAutoUpdate_Name">WAU AutoUpdate deaktivieren</string>
      <string id="DisableAutoUpdate_Explain">Diese Richtlinie legt fest, ob WAU AutoUpdate deaktiviert wird oder nicht:
Standardmäßig ist WAU AutoUpdate aktiviert.
Es werden keine Konfigurationen, Symbole (wenn personalisiert) oder die Ausschlussliste überschrieben.

Wenn diese Richtlinie deaktiviert oder nicht konfiguriert ist, ist der Standardwert "Nein".</string>
      <string id="DoNotRunOnMetered_Name">WAU auf getakteten Verbindungen ausführen</string>
      <string id="DoNotRunOnMetered_Explain">Diese Richtlinie legt fest, ob WAU auf getakteten Verbindungen ausgeführt wird oder nicht.

Wenn diese Richtlinie deaktiviert oder nicht konfiguriert ist, ist der Standardwert "Nein".</string>
      <string id="UpdatePrerelease_Name">WAU auf PreRelease-Versionen aktualisieren</string>
      <string id="UpdatePrerelease_Explain">Diese Richtlinie legt fest, ob WAU auf PreRelease-Versionen (über WAU AutoUpdate) aktualisiert wird.

Wenn diese Richtlinie deaktiviert oder nicht konfiguriert ist, ist der Standardwert "Nein".</string>
      <string id="BlackList_Name">Anwendungs-GPO-Blacklist</string>
      <string id="BlackList_Explain">Geben Sie die WinGet-IDs der Anwendungen ein, die ausgeschlossen werden sollen.

Wenn diese Richtlinie deaktiviert oder nicht konfiguriert ist, wird die GPO-Blacklist nicht verwendet.</string>
      <string id="WhiteList_Name">Anwendungs-GPO-Whitelist</string>
      <string id="WhiteList_Explain">Geben Sie die WinGet-IDs der Anwendungen ein, die enthalten sein sollen.

Wenn diese Richtlinie deaktiviert oder nicht konfiguriert ist, wird die GPO-Whitelist nicht verwendet.</string>
      <string id="UseWhiteList_Name">Whitelist anstelle der Blacklist verwenden</string>
      <string id="UseWhiteList_Explain">Diese Richtlinie legt fest, ob eine Whitelist verwendet wird oder nicht.

Wenn diese Richtlinie deaktiviert oder nicht konfiguriert ist, ist der Standardwert "Nein".</string>
      <string id="ListPath_Name">Black/White-Liste von externem Pfad (URL/UNC/GPO/Lokal) abrufen</string>
      <string id="ListPath_Explain">Wenn diese Richtlinie aktiviert ist, können Sie einen (URL/UNC/GPO/Lokal)-Pfad für externe Listen festlegen, die nicht der Standardliste entsprechen.
Wenn die "Anwendungs-GPO-Blacklist/Whitelist" in diesem GPO festgelegt ist, kann der Pfad "GPO" sein.

Wenn diese Richtlinie deaktiviert oder nicht konfiguriert ist, wird der Standard-ListPath verwendet (WAU-Installationsort).</string>
      <string id="ModsPath_Name">Mods von externem Pfad (URL/UNC/Lokal/AzureBlob) abrufen</string>
      <string id="ModsPath_Explain">Wenn diese Richtlinie aktiviert ist, können Sie einen (URL/UNC/Lokal/AzureBlob)-Pfad für externe Mods festlegen, die nicht dem Standard entsprechen.

Wenn diese Richtlinie deaktiviert oder nicht konfiguriert ist, wird der Standard-ModsPath verwendet (WAU-Installationsort).

Hinweis: Wenn auf 'AzureBlob' gesetzt, stellen Sie sicher, dass auch die 'Azure Blob URL mit SAS-Token' konfiguriert ist.</string>
      <string id="BlobURL_Name">Azure Blob-URL mit SAS-Token festlegen</string>
      <string id="BlobURL_Explain">Wenn diese Richtlinie aktiviert ist, können Sie eine Azure Storage Blob-URL mit SAS-Token für die Verwendung mit der 'Mods'-Funktion festlegen. Die URL muss das SAS-Token enthalten und über 'Lese-' und 'Listen'-Berechtigungen verfügen.

Wenn diese Richtlinie deaktiviert oder nicht konfiguriert ist, ist der Wert leer und die Azure Blob-Speicherung wird NICHT funktionieren.</string>
      <string id="NotificationLevel_Name">Benachrichtigungsstufe</string>
      <string id="NotificationLevel_Explain">Wenn diese Richtlinie aktiviert ist, können Sie die Benachrichtigungsstufe konfigurieren:
1. Voll (Standard)
2. Nur Erfolg
3. Keine

Wenn diese Richtlinie deaktiviert oder nicht konfiguriert ist, gilt die Benachrichtigungsstufe: (1. Voll).</string>
      <string id="NotificationLevel_Full">1. Voll (Standard)</string>
      <string id="NotificationLevel_SuccessOnly">2. Nur Erfolg</string>
      <string id="NotificationLevel_None">3. Keine</string>
      <string id="UpdatesInterval_Name">Update-Intervall</string>
      <string id="UpdatesInterval_Explain">Wenn diese Richtlinie aktiviert ist, können Sie das Update-Intervall konfigurieren:
1. Täglich (Standard)
2. Zweitägig
3. Wöchentlich
4. Zweiwöchentlich
5. Monatlich
6. Nie (z. B. in Kombination mit 'Updates beim Anmelden')

Wenn diese Richtlinie deaktiviert oder nicht konfiguriert ist, ist das Update-Intervall: (1. Täglich).</string>
      <string id="UpdatesInterval_Daily">1. Täglich (Standard)</string>
      <string id="UpdatesInterval_BiDaily">2. Zweitägig</string>
      <string id="UpdatesInterval_Weekly">3. Wöchentlich</string>
      <string id="UpdatesInterval_BiWeekly">4. Zweiwöchentlich</string>
      <string id="UpdatesInterval_Monthly">5. Monatlich</string>
      <string id="UpdatesInterval_Never">6. Nie</string>
      <string id="UpdatesAtLogon_Name">Updates beim Anmelden</string>
      <string id="UpdatesAtLogon_Explain">Diese Richtlinie legt fest, ob WAU beim Benutzeranmelden ausgeführt wird oder nicht.

Wenn diese Richtlinie deaktiviert oder nicht konfiguriert ist, ist der Standardwert "Nein".</string>
      <string id="UpdatesAtTime_Name">Updates zur festgelegten Zeit</string>
      <string id="UpdatesAtTime_Explain">Wenn diese Richtlinie aktiviert ist, können Sie die geplante Update-Zeit konfigurieren:
Von 01:00 bis 24:00 Uhr (24-Stunden-Zeit)

Wenn diese Richtlinie deaktiviert oder nicht konfiguriert ist, ist die Update-Zeit: (06:00 Uhr).</string>
      <string id="UpdatesAtTime01">01:00 Uhr</string>
      <string id="UpdatesAtTime02">02:00 Uhr</string>
      <string id="UpdatesAtTime03">03:00 Uhr</string>
      <string id="UpdatesAtTime04">04:00 Uhr</string>
      <string id="UpdatesAtTime05">05:00 Uhr</string>
      <string id="UpdatesAtTime06">06:00 Uhr (Standard)</string>
      <string id="UpdatesAtTime07">07:00 Uhr</string>
      <string id="UpdatesAtTime08">08:00 Uhr</string>
      <string id="UpdatesAtTime09">09:00 Uhr</string>
      <string id="UpdatesAtTime10">10:00 Uhr</string>
      <string id="UpdatesAtTime11">11:00 Uhr</string>
      <string id="UpdatesAtTime12">12:00 Uhr</string>
      <string id="UpdatesAtTime13">13:00 Uhr</string>
      <string id="UpdatesAtTime14">14:00 Uhr</string>
      <string id="UpdatesAtTime15">15:00 Uhr</string>
      <string id="UpdatesAtTime16">16:00 Uhr</string>
      <string id="UpdatesAtTime17">17:00 Uhr</string>
      <string id="UpdatesAtTime18">18:00 Uhr</string>
      <string id="UpdatesAtTime19">19:00 Uhr</string>
      <string id="UpdatesAtTime20">20:00 Uhr</string>
      <string id="UpdatesAtTime21">21:00 Uhr</string>
      <string id="UpdatesAtTime22">22:00 Uhr</string>
      <string id="UpdatesAtTime23">23:00 Uhr</string>
      <string id="UpdatesAtTime24">24:00 Uhr</string>
      <string id="UserContext_Name">Ausführung im Benutzerkontext</string>
      <string id="UserContext_Explain">Diese Richtlinie legt fest, ob die Ausführung im Benutzerkontext aktiviert wird oder nicht.

Wenn diese Richtlinie deaktiviert oder nicht konfiguriert ist, ist der Standardwert "Nein".</string>
      <string id="DesktopShortcut_Name">Desktop-Verknüpfung aktivieren [VERALTET]</string>
      <string id="DesktopShortcut_Explain">Diese Richtlinie legt fest, ob eine Desktop-Verknüpfung aktiviert wird oder nicht:
WAU - Apps auf Updates prüfen

Wenn diese Richtlinie deaktiviert oder nicht konfiguriert ist, ist der Standardwert "Nein".</string>
      <string id="StartMenuShortcut_Name">Startmenü-Verknüpfungen aktivieren [VERALTET]</string>
      <string id="StartMenuShortcut_Explain">Diese Richtlinie legt fest, ob die Startmenü-Verknüpfungen aktiviert werden oder nicht:
WAU - Apps auf Updates prüfen
WAU - Protokolle öffnen
WAU - Web-Hilfe

Wenn diese Richtlinie deaktiviert oder nicht konfiguriert ist, ist der Standardwert "Nein".</string>
      <string id="MaxLogFiles_Name">Protokoll: Anzahl der zulässigen Protokolldateien</string>
      <string id="MaxLogFiles_Explain">Wenn diese Richtlinie aktiviert ist, können Sie die Anzahl der zulässigen Protokolldateien festlegen:
Wenn MaxLogFiles auf 0 gesetzt ist, werden keine alten archivierten Protokolldateien gelöscht, 1 behält die Originaldatei bei und lässt sie nur weiter wachsen.
Die Standardanzahl beträgt 3 (0-99).

Wenn diese Richtlinie deaktiviert oder nicht konfiguriert ist, wird die Standardanzahl verwendet.</string>
      <string id="MaxLogSize_Name">Protokoll: Größe der Protokolldatei in Bytes vor dem Drehen</string>
      <string id="MaxLogSize_Explain">Wenn diese Richtlinie aktiviert ist, können Sie die Größe der Protokolldatei in Bytes festlegen, bevor sie rotiert wird.
Die Standardgröße beträgt 1048576 = 1 MB.

Wenn diese Richtlinie deaktiviert oder nicht konfiguriert ist, wird die Standardgröße verwendet.</string>
    </stringTable>
    <presentationTable>
      <presentation id="BlackList">
        <listBox refId="BlackList">Blacklist:</listBox>
      </presentation>
      <presentation id="WhiteList">
        <listBox refId="WhiteList">Whitelist:</listBox>
      </presentation>
      <presentation id="ListPath">
        <textBox refId="ListPath">
          <label>(URL/UNC/GPO/Lokal) Pfad:</label>
        </textBox>
      </presentation>
      <presentation id="ModsPath">
        <textBox refId="ModsPath">
          <label>(URL/UNC/Lokal/AzureBlob) Pfad:</label>
        </textBox>
      </presentation>
      <presentation id="BlobURL">
            <textBox refId="BlobURL">
                  <label>Azure Storage-URL mit SAS-Token:</label>
            </textBox>
      </presentation>
      <presentation id="NotificationLevel">
        <dropdownList refId="NotificationLevel"/>
      </presentation>
      <presentation id="UpdatesInterval">
        <dropdownList refId="UpdatesInterval"/>
      </presentation>
      <presentation id="UpdatesAtTime">
        <dropdownList refId="UpdatesAtTime"/>
      </presentation>
      <presentation id="MaxLogFiles">
        <textBox refId="MaxLogFiles">
          <label>Zulässige Protokolldateien:</label>
        </textBox>
      </presentation>
      <presentation id="MaxLogSize">
        <textBox refId="MaxLogSize">
          <label>Größe der Protokolldatei:</label>
        </textBox>
      </presentation>
    </presentationTable>
  </resources>
</policyDefinitionResources>


ADUserTool – Einfaches Erstellen von Active Directory Benutzern mit GUI

Verwalte Active Directory Benutzer schnell und effizient mit dem ADUserTool! Dieses benutzerfreundliche Tool bietet eine grafische Benutzeroberfläche (GUI), um neue Benutzer einfach zu erstellen und automatisch ein sicheres Passwort zu generieren. Das Tool richtet sich an Administratoren, die eine schnelle und intuitive Lösung suchen, um Active Directory Benutzer hinzuzufügen, ohne komplizierte Skripte schreiben zu müssen.

Hauptfunktionen:

  • Benutzerfreundliche GUI zur Erstellung neuer AD-Benutzer
  • Automatische Generierung eines sicheren Passworts
  • Erstellung eines Logon-Skripts, das den Benutzern zugewiesen wird (manuell anpassbar)
  • Protokollierung der Benutzererstellung in detaillierten Logdateien
  • Automatische Verknüpfungserstellung auf dem Desktop und im Startmenü

Installation:

Laden Sie das Tool herunter und führen Sie die Installation als Administrator aus. Das Tool wird unter C:\Program Files\ADUserTool installiert und erstellt Verknüpfungen, um einen einfachen Zugriff auf das Tool zu gewährleisten.

Verwendung:

Nach der Installation können Sie das Tool über die Desktop-Verknüpfung oder das Startmenü starten. Geben Sie die erforderlichen Informationen wie Vorname, Nachname und E-Mail des Benutzers ein, und das Tool erledigt den Rest!


Download:

Laden Sie das ADUserTool jetzt herunter und vereinfachen Sie Ihre AD-Benutzerverwaltung:

Download ADUserTool


Gezielter AD-Join mit Powershell Skript

Allgemeine Informationen

Dieses PowerShell-Skript ermöglicht es, einen Computer automatisch umzubenennen und anschließend einer spezifischen Active Directory-Domäne beizutreten. Zusätzlich wird der Computer in eine vorgegebene Organizational Unit (OU) verschoben. Standardmäßig führt das Skript nach diesen Änderungen einen Neustart durch, um sicherzustellen, dass alle Anpassungen wirksam werden.

Skript

# Funktion zur Überprüfung, ob das Skript als Administrator ausgeführt wird
function Ensure-RunAsAdministrator {
    $currentUser = [Security.Principal.WindowsIdentity]::GetCurrent()
    $isAdmin = (New-Object Security.Principal.WindowsPrincipal($currentUser)).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)

    if (-not $isAdmin) {
        Write-Host "Das Skript wird nicht als Administrator ausgeführt. Starte das Skript als Administrator neu."
        Start-Process powershell -ArgumentList "-NoProfile -ExecutionPolicy Bypass -File `"$PSCommandPath`"" -Verb RunAs
        exit
    }
}

# Funktion zur Überprüfung der Windows-Edition (muss mindestens "Pro" oder höher sein)
function Check-WindowsEdition {
    $edition = (Get-WmiObject -Class Win32_OperatingSystem).OperatingSystemSKU

    # Windows Pro und höher haben die folgenden SKU-Codes: 48 = Pro, 49 = Pro N, 50 = Enterprise, 51 = Education, etc.
    $allowedEditions = @(48, 49, 50, 51)

    if ($allowedEditions -notcontains $edition) {
        Write-Host "Das Betriebssystem unterstützt keinen Beitritt zur Domäne. Es wird mindestens Windows Pro oder eine höhere Version benötigt."
        pause
        exit
    } else {
        Write-Host "Das Betriebssystem unterstützt den Beitritt zur Domäne."
    }
}

# Admin-Rechte sicherstellen
Ensure-RunAsAdministrator

# Überprüfen, ob die Windows-Edition "Pro" oder höher ist
Check-WindowsEdition

# Variablen definieren
$domäne = "DeineDomäne.local"  # Hier die Domäne eintragen
$Benutzername = "DomänenBenutzer"  # Hier den Domänenbenutzernamen eintragen
$Passwort = "DomänenPasswort"  # Hier das Domänenpasswort eintragen
$ou = "OU=Computer,OU=Standort,DC=DeineDomäne,DC=local"  # Hier die gewünschte OU eintragen
$AdminBenutzer = "$domäne\$Benutzername"
$neuerComputername = Read-Host "Bitte geben Sie den neuen Computernamen ein"

# Funktion zum Join in die Domäne mit spezieller OU und ohne Neustart
function Join-ComputerToDomain {
    $securePassword = ConvertTo-SecureString $Passwort -AsPlainText -Force
    $credentials = New-Object System.Management.Automation.PSCredential($AdminBenutzer, $securePassword)
      
    Add-Computer -DomainName $domäne -NewName $neuerComputername -Credential $credentials -OUPath $ou -PassThru -Force | Out-Null
    Write-Host "Der Computer wurde in die Domäne $domäne in die OU $ou aufgenommen"
}

# Funktion um Benutzer nach Neustart zu fragen (Standard ist Neustart)
function Prompt-Restart {
    $response = Read-Host "Möchten Sie den Neustart abbrechen? (nein/ja) [nein]"
      
    if ($response -eq "ja") {
        Write-Host "Neustart wurde abgebrochen. Änderungen werden nach einem manuellen Neustart aktiv."
    } else {
        Write-Host "Der Computer wird jetzt neu gestartet..."
        Restart-Computer -Force
    }
}

# Ausführen
# Computer zur Domäne hinzufügen
Join-ComputerToDomain

# Benutzer nach Neustart fragen (Standard ist Neustart)
Prompt-Restart

Skript ausführen

Schritt 1: PowerShell-Skript herunterladen und anpassen

  1. Erstelle das Skript lokal auf deinem Rechner.
  2. Öffne das Skript in einem Texteditor (z. B. Notepad, Visual Studio Code) und passe die folgenden Variablen entsprechend deinen Anforderungen an:
  • $domäne: Hier den Namen deiner Domäne eintragen (z. B. DeineDomäne.local).
  • $Benutzername: Der Benutzername eines Domänenadministrators.
  • $Passwort: Das Passwort des Domänenadministrators (Achtung: Verwende starke Passwörter!).
  • $ou: Die Organisationseinheit (OU), in der die Computer hinzugefügt werden sollen.

Speichere die Änderungen ab, sobald du alle Variablen angepasst hast.

Schritt 2: PowerShell ausführen

Öffne die CMD als Administrator und gebe folgenden Befehl ein.

powershell.exe -ExecutionPolicy Bypass -File C:\Pfad\Zu\Deinem\Skript.ps1

Mitglieder aus einer AD Gruppe in eine andere AG Gruppe kopieren

Du möchtest alle Mitglieder aus einer AD-Gruppe in eine andere AD-Gruppe schmeißen? Dann füge das Skript einfach in der PowerShell ein.

Dies ist hilfreich wenn man im nachhinein z.B. einen Mailverteiler Gruppe erstellt hast. Hierfür musst du allerdings Admin Berechtigungen in der AD haben.

Quell_Gruppe: Die AD-Gruppe aus der die Mitglieder kopiert werden sollen

Ziel_Gruppe: Die AD-Gruppe in die die Mitglieder kopiert werden

$Quell_Gruppe = "Gruppe1"
$Ziel_Gruppe = "Gruppe2"



$Gruppe = Get-ADGroupMember $Quell_Gruppe | Select sAMAccountName
$Gruppe | ForEach { Add-ADGroupMember $Ziel_Gruppe -Members $_.sAMAccountName}

Anzahl der Bitlocker Keys aus der AD auslesen

Du möchtest die Anzahl der einzelnen Bitlocker Keys eines Clients aus der Ad auslesen. Dafür brauchst du einfach dieses Skript. Es geht einmal über die AD und gibt dir zum Schluss die Anzahl aus.

write-host "get-bitlockercomputer: Start"
$Bitlockerclients = @{}



$RootNC = ([ADSI]"LDAP://RootDSE").rootDomainNamingContext
$objSearcher = [adsisearcher]([ADSI]"GC://$RootNC")
$objSearcher.PageSize = 1000   
$objSearcher.filter = "(objectclass=msFVE-RecoveryInformation)"
$objSearcher.SearchScope = "subtree"
$objSearcher.PropertiesToLoad.Clear() | Out-Null   

write-host "get-bitlockercomputer: Search for Recovery Information"
[long]$volumes=0
$objSearcher.findall() | % {
	$volumes++
  	$computer = [ADSI](([adsi]($_.path)).parent) 
	$computerdn = $computer.distinguishedname[0]
	Write-Progress -Activity "Adding Computer $computerdn" -status $volumes
	
	If ($Bitlockerclients.item($computerdn)) {
		$Bitlockerclients.item($computerdn)++
	}
	Else {
		$Bitlockerclients.item($computerdn)=[int]1
	}
}
[long]$totalcomputer = $Bitlockerclients.count
# Find all Computers
write-host " Search for all Computers to generate list"
$objSearcher.filter = "(objectclass=Computer)"
$objSearcher.PropertiesToLoad.Add(“Name”) | Out-Null
$objSearcher.PropertiesToLoad.Add(“distinguishedname”) | Out-Null
$objSearcher.PropertiesToLoad.Add(“dNSHostName”) | Out-Null

[long]$matchcount = 0 
$objSearcher.findall() | % {
	Write-Progress -Activity ("Matching Computer " +$_.properties.name) -status $matchcount -percentcomplete ($matchcount/$totalcomputer*100)
	$result = "" | select computername,dNSHostName,distinguishedname,bitlockervolumes
	if ($_.properties.name) {$result.computername = $_.properties.name[0]}
	if ($_.properties.dnshostname) { $result.dNSHostName = $_.properties.dnshostname[0]}
	$result.distinguishedname = $_.properties.distinguishedname[0]
  	If ($Bitlockerclients.item($_.properties.distinguishedname[0])) {
		$result.bitlockervolumes = $Bitlockerclients.item($_.properties.distinguishedname[0])
		$matchcount++
	}
	else {
		$result.bitlockervolumes = $null
	}
	$result    
}
write-host "get-bitlockercomputer: End"

Quelle:

Get-BitlockerReport (msxfaq.de)

Windows 10 Domain User automatisch anmelden

Du möchtest das ein Domain User an einem Client automatisch angemeldet wird. Dies ist leider nicht mehr so einfach über die Windows Boardmittel möglich und muss mittlerweile über die Registry gesetzt werden.

Registry öffnen

[Windows-Taste] + [r] regedit – eingeben und bestätigen

Folgendem Schlüssel wechseln

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon

Parameter anpassen

DefaultUserName  Username Bsp.: it-hense.de\Autologon
DefaultPassword  Passwort Bsp.: Passwort123!
DefaultDomainName Domäne Bsp.: it-hense.de
AutoAdminLogon  auf Wert 1 setzen

Fertig

Nun sollte nach einem Systemreboot der Angelegte Benutzer automatisch anmelden.


PowerShell Befehle

Auslesen ob Computer in einer Domäne ist

Mit diesem Befehl gibt dir die Konsole den Domänen Namen zurück

Get-WmiObject -Class Win32_ComputerSystem | Select-Object Domain

Mit diesem gibt dir die Konsole nur ein true für ja der Computer ist in einer Domäne und false für nein ich bin in einer Workgroup

(Get-WmiObject -Class Win32_ComputerSystem).PartOfDomain

Auslesen wer auf einen Ordner Berechtigt ist.

(Get-Acl C:\Windows).Access

User aus einer AD Gruppe auslesen

Get-ADGroupMember -Identity AD-Gruppe | select name

Bild in Bas64 Convertieren

[convert]::ToBase64String((Get-Content D:\Images\image1.jpg -Encoding byte))


Domain Join mittels PowerShell

In diesem Beitrag zeige ich dir wie du einen Windows Client in eine Windows Domaine per Skript aufnimmst.

Im Beispiel ist die Domaine die „hense.local“ uns das Passwort liegt verschlüsselt unter „C:\temp“.
In einem anderen Beitrag habe ich schonmal gezeigt wie man ein Passwort mittels PowerShell verschlüsseln kann. Dies wird hier benötigt.

Schritte

  • Passwort Verschlüsseln
  • Variablen anpassen
  • Skript als Admin ausführen
### Erstellt am 22.05.2021 - Philipp Hense - it-hense.de ###

# Variablen

$DomainName = "hense.local"
$PasswortSpeicherort = C:\temp


## Ab hier nichts mehr ändern ##

#Credentials aufbauen
$username = "Administrator"
$key = (3,4,2,3,6,2,1,1,2,3,2,4,3,1,4,2)
$password = get-content ("$PasswortSpeicherort\passwort.txt") | convertto-securestring -key $key
$credentials = New-Object System.Management.Automation.PSCredential (“$username”, $password)

#Domain Join
Add-Computer -DomainName $DomainName -Restart -Credential $credentials

PowerShell Passwort verschlüsseln

In diesem Beitrag zeige ich dir wie du mittels PowerShell ein Passwort verschlüsseln kannst. Dies wird oftmals gebraucht um ein Passwort in ein Skript einzubauen ohne das es in Klartext eingefügt wird. Wenn du dieses Skript benötigst lade dir den Sourcecode herunter.

Skripte

### Erstellt am 23.03.2021 - Philipp Hense ###

Add-Type -AssemblyName System.Windows.Forms
[System.Windows.Forms.Application]::EnableVisualStyles()

$Speicherort                     = New-Object system.Windows.Forms.Form
$Speicherort.ClientSize          = New-Object System.Drawing.Point(725,232)
$Speicherort.text                = "Speicherort"
$Speicherort.TopMost             = $false
$Speicherort.icon                = ".\icon.ico"

$Eingabe                         = New-Object system.Windows.Forms.TextBox
$Eingabe.multiline               = $false
$Eingabe.text                    = "z.B. C:\temp"
$Eingabe.width                   = 673
$Eingabe.height                  = 20
$Eingabe.Anchor                  = 'top,right,bottom,left'
$Eingabe.location                = New-Object System.Drawing.Point(30,78)
$Eingabe.Font                    = New-Object System.Drawing.Font('Courier New',12,[System.Drawing.FontStyle]([System.Drawing.FontStyle]::Italic))
$Eingabe.ForeColor               = [System.Drawing.ColorTranslator]::FromHtml("#0017ff")
$Eingabe.BackColor               = [System.Drawing.ColorTranslator]::FromHtml("#ffffff")

$Label                           = New-Object system.Windows.Forms.Label
$Label.text                      = "Bitte gebe hier den Pfad an in der das Passwort verschluesselt abgespeichert werden soll."
$Label.AutoSize                  = $true
$Label.width                     = 350
$Label.height                    = 10
$Label.Anchor                    = 'top,right,left'
$Label.location                  = New-Object System.Drawing.Point(6,15)
$Label.Font                      = New-Object System.Drawing.Font('MV Boli',12)

$abbrechen                       = New-Object system.Windows.Forms.Button
$abbrechen.text                  = "Abbrechen"
$abbrechen.width                 = 210
$abbrechen.height                = 40
$abbrechen.location              = New-Object System.Drawing.Point(116,159)
$abbrechen.Font                  = New-Object System.Drawing.Font('Tw Cen MT',12,[System.Drawing.FontStyle]([System.Drawing.FontStyle]::Bold))
$abbrechen.ForeColor             = [System.Drawing.ColorTranslator]::FromHtml("#ff0000")
$abbrechen.BackColor             = [System.Drawing.ColorTranslator]::FromHtml("#d1d1d1")
$abbrechen.Add_Click({$Speicherort.Close()})


$speichern                       = New-Object system.Windows.Forms.Button
$speichern.text                  = "Speichern"
$speichern.width                 = 210
$speichern.height                = 41
$speichern.location              = New-Object System.Drawing.Point(377,158)
$speichern.Font                  = New-Object System.Drawing.Font('Tw Cen MT',12,[System.Drawing.FontStyle]([System.Drawing.FontStyle]::Bold))
$speichern.ForeColor             = [System.Drawing.ColorTranslator]::FromHtml("#03770e")
$speichern.BackColor             = [System.Drawing.ColorTranslator]::FromHtml("#d1d1d1")

$speichern.Add_Click({$Speicherort.Close(); .\passwort-hash.lnk -Eingabe $Eingabe.Text})

$copyright                       = New-Object system.Windows.Forms.Label
$copyright.text                  = " 2021 Philipp Hense"
$copyright.AutoSize              = $true
$copyright.width                 = 25
$copyright.height                = 10
$copyright.location              = New-Object System.Drawing.Point(10,218)
$copyright.Font                  = New-Object System.Drawing.Font('Microsoft Sans Serif',7)
$copyright.ForeColor             = [System.Drawing.ColorTranslator]::FromHtml("#acacac")

$Speicherort.controls.AddRange(@($Eingabe,$Label,$abbrechen,$speichern,$copyright))



[void]$Speicherort.ShowDialog()
### Erstellt am 23.03.2021 - Philipp Hense ###

param (
 [string] $Eingabe = $Eingabe
)

$File = "$Eingabe"
$File_a = ("$File").TrimStart("System.Windows.Forms.TextBox, Text: ")
$File_neu = $File_a + "\passwort.txt"
$password = Read-Host Bitte Passwort eingeben -AsSecureString
$key = (3,4,2,3,6,2,1,1,2,3,2,4,3,1,4,2)
$password | ConvertFrom-SecureString -key $key| Set-Content ("$file_neu")

Links

Philipp Hense / Powershell-Passwort-verschlüsseln · GitLab


WordPress Cookie Plugin von Real Cookie Banner