Lokale Konten mit Powershell-Skript löschen

Lokale Konten mit Powershell-Skript löschen

Ich habe dieses Skript mit freundlicher Genehmigung von Google gefunden, das alle lokalen Konten entfernt, aber ich möchte diese behalten: Administrator, DefaultAccount, DevToolsUser, Guest, sshd, User, WDAGUtilityAccount. Kann mir jemand helfen?

Function Remove-LocalUser
{
  <#
      .Synopsis
      This function deletes a local user 
      .Description
      This function deletes a local user
      .Example
      Remove-LocalUser -userName "ed" 
      Removes a new local user named ed. 
      .Parameter ComputerName
      The name of the computer upon which to delete the user
      .Parameter UserName
      The name of the user to delete
      .Notes
      NAME:  Remove-LocalUser
      AUTHOR: ed wilson, msft
      LASTEDIT: 06/29/2011 10:07:42
      KEYWORDS: Local Account Management, Users
      HSG: HSG-06-30-11
      .Link
      Http://www.ScriptingGuys.com/blog
      #Requires -Version 2.0
  #>
  [CmdletBinding()]
  Param(
    [Parameter(Position=0,
        Mandatory=$True,
      ValueFromPipeline=$True)]
    [string]$userName
  )
  $computerName = $env:ComputerName
  $User = [ADSI]"WinNT://$computerName"
  $user.Delete('user',$userName)
} #end function Remove-LocalUser

$localUsers = Get-WmiObject -Class Win32_UserAccount -Filter  "LocalAccount='True'" | Select-Object Name
foreach ($localUser in  $localUsers.Name){
  Write-Host $localUser
  Remove-LocalUser -userName $localUser
}

Antwort1

PowerShell verfügt über integrierte Cmdlets zum Verwalten lokaler Benutzerkonten. Diese sollten daher einem benutzerdefinierten Modul vorgezogen werden (vorausgesetzt, Sie verwenden eine ausreichend hohe Version von PowerShell):

$KeepUsers = "Administrator", "Standardkonto", "DevToolsUser", "Gast", "sshd", "Benutzer", "WDAGUtilityAccount"
Get-LocalUser | ? { $KeepUsers -notcontains $_.Name } | Remove-LocalUser

Von links nach rechts:

  1. Alle lokalen Benutzer abrufen.
  2. Leiten Sie es weiter an Where-Object( ?ist ein Alias).
  3. Filtern Sie nur nach Benutzern, deren Benutzernamen nicht im $KeepUsersArray erscheinen.
  4. Leiten Sie die neu gefilterten Benutzer dorthin weiter, Remove-LocalUserwo sie gelöscht werden.

Antwort2

Versuche dies:

Get-WMIObject -Class Win32_UserAccount -Filter "LocalAccount='True'" | Where-Object {$_.Name -notin @("Administrator", "DefaultAccount", "DevToolsUser", "Guest", "sshd", "User", "WDAGUtilityAccount")} | Foreach {net user "$_.Name" /delete}
  • Listen Sie zunächst alle lokalen Benutzerkonten über WMI auf.
  • Verwenden Sie dann den Where-Object-Filter, um die beizubehaltenden Benutzerkonten auszuschließen.
  • Dann übergeben Sie die Objekte an den Foreach-Block.
  • Löschen Sie nun mit die Benutzerkonten net user.

Fußnoten

  • Dieses Skript muss mit Administratorrechten ausgeführt werden.
  • Sie müssen dies von einem Benutzerkonto aus tun, um nicht zum Löschen markiert zu werden.

Antwort3

Auf PowerShellGallery.com gibt es ein PowerShell-Modul genau für diesen Anwendungsfall.

Find-Module -Name '*localuser*' | Format-Table -AutoSize
# Results
<#
Version Name                Repository Description                                                   
------- ----                ---------- -----------                                                   
3.0     LocalUserManagement PSGallery  a module that performs various local user management functions
#>

In PowerShell v5x und PowerShell Core6x oder höher.

Get-Command -Name '*localuser*' | Format-Table -Autosize
# Results
<#
CommandType Name              Version Source                            
----------- ----              ------- ------                            
Cmdlet      Disable-LocalUser 1.0.0.0 Microsoft.PowerShell.LocalAccounts
Cmdlet      Enable-LocalUser  1.0.0.0 Microsoft.PowerShell.LocalAccounts
Cmdlet      Get-LocalUser     1.0.0.0 Microsoft.PowerShell.LocalAccounts
Cmdlet      New-LocalUser     1.0.0.0 Microsoft.PowerShell.LocalAccounts
Cmdlet      Remove-LocalUser  1.0.0.0 Microsoft.PowerShell.LocalAccounts
Cmdlet      Rename-LocalUser  1.0.0.0 Microsoft.PowerShell.LocalAccounts
Cmdlet      Set-LocalUser     1.0.0.0 Microsoft.PowerShell.LocalAccounts
#>

Sie könnten also einfach dies tun ...

Get-LocalUser | 
Where Name -NotMatch 'Administrator|DefaultAccount|Guest|WDAGUtilityAccount'

Dasselbe können Sie für das Cmdlet „Remove“ tun.

Antwort4

Das Löschen eines lokalen Kontos klingt nach einer einzelnen Aufgabe, umfasst aber mindestens die folgenden drei Schritte:

  1. Löschen des Kontos aus der lokalen Kontodatenbank
  2. Löschen Sie das Profilverzeichnis dieses Kontos
  3. Löschen des Kontoprofils aus der Registrierung

Es könnte noch mehr Schritte geben, aber ich habe bisher keine Dokumentation dazu gefunden. Da mehrere Schritte ausgeführt werden müssen, ist es wahrscheinlich keine gute Idee, dafür zu atomare Funktionen zu verwenden. Das Remove-LocalUserCmdlet und das netTool (mit net user <username> /delete) sind solche atomaren Funktionen. Sie schlagen vor, einen lokalen Benutzer zu löschen – was gut klingt – aber sie löschen den Benutzer tatsächlich (nur) aus der lokalen Benutzerkontodatenbank. Dies könnte für einige Szenarien ausreichend sein, aber beachten Sie, dass Registrierungsschlüssel und das Profilverzeichnis erhalten bleiben!

Microsoft bietet eine Makrofunktion zum vollständigen Löschen eines lokalen Benutzerkontos an, leider nur in der GUI. Diese findet ihr unterEinstellungen > Konten > Familie & andere Benutzer. Wählen Sie einfach einen Benutzer aus und klicken Sie aufEntfernen, dann aufKonto und Daten löschen. Dadurch werden alle drei oben genannten Schritte ausgeführt.

Es gibt auch eine Makrofunktion, um (nur) das Profil eines Benutzers zu entfernen. Sie können diese öffnen überSystemsteuerung > System > Erweiterte Systemeinstellungen > Einstellungen...(Schaltfläche imBenutzerprofilBedienfeld):

Bildbeschreibung hier eingeben

Sie können dieses Fenster auch direkt öffnen, indem Sie es rundll32 sysdm.cpl,EditUserProfilesin einer erhöhten PowerShell ausführen. Es ist wichtig, dieses Fenster mit Administratorrechten zu öffnen, um alle Benutzerkonten und nicht nur das eigene Konto anzuzeigen (auch beim Öffnen über die GUI).

Wenn Sie ein Benutzerkonto über dieses Fenster löschen, werden die oben genannten Schritte 2 und 3 ausgeführt.

Sie fragen sich, was die beiden unbekannten Konten sind? Es handelt sich um die Überreste zweier gelöschter Konten, von denen eines vom Remove-LocalUserCmdlet und eines vom netTool gelöscht wurde.

Da Sie nach einer PowerShell-Lösung suchen, können wir zumindest die drei oben genannten Schritte manuell ausführen, sofern PowerShell kein Cmdlet bereitstellt, das die gesamte Arbeit auf einmal erledigt:

function Remove-LocalUserCompletely {

    Param(
        [Parameter(ValueFromPipelineByPropertyName)]
        $Name
    )

    process {
        $user = Get-LocalUser -Name $Name -ErrorAction Stop

        # Remove the user from the account database
        Remove-LocalUser -SID $user.SID

        # Remove the profile of the user (both, profile directory and profile in the registry)
        Get-CimInstance -Class Win32_UserProfile | ? SID -eq $user.SID | Remove-CimInstance
    }
}

# Example usage:
Remove-LocalUserCompletely -Name 'myuser'

Diese Funktion kann in einer Pipeline verwendet werden. Sie können daher alle Benutzer außer denen, die Sie behalten möchten, wie folgt löschen:

Get-LocalUser | ? Name -NotIn Administrator, DefaultAccount, DevToolsUser, Guest, sshd, User, WDAGUtilityAccount | Remove-LocalUserCompletely

Derzeit (in PS v5.1.18362.752) ist jedoch die Pipeline zwischen Get-LocalUserund Remove-LocalUserfehlerhaft, was sich auch auf meine obige Funktion auswirken wird. Die folgende Pipeline (ohne Remove-LocalUserCompletely) entfernt nur jedes zweite Benutzerkonto aus der Kontodatenbank der Konten, die gelöscht werden sollen:

Get-LocalUser | ? Name -NotIn Administrator, DefaultAccount, DevToolsUser, Guest, sshd, User, WDAGUtilityAccount | Remove-LocalUser

Sie können dies umgehen, indem Sie statt einer Pipeline eine Schleife verwenden (jetzt mit Remove-LocalUserCompletely):

$users = Get-LocalUser | ? Name -NotIn Administrator, DefaultAccount, DevToolsUser, Guest, sshd, User, WDAGUtilityAccount
foreach ($user in $users) {
    Remove-LocalUserCompletely -Name $user.Name
}

verwandte Informationen