Удаление локальных учетных записей с помощью скрипта Powershell

Удаление локальных учетных записей с помощью скрипта Powershell

Я нашел этот скрипт, любезно предоставленный Google, который удаляет все локальные учетные записи, но я хотел бы оставить следующие: Administrator, DefaultAccount, DevToolsUser, Guest, sshd, User, WDAGUtilityAccount. Может ли кто-нибудь мне помочь?

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
}

решение1

PowerShell имеет встроенные командлеты для управления локальными учетными записями пользователей, поэтому их следует предпочесть пользовательскому модулю (при условии, что вы используете достаточно новую версию PowerShell):

$KeepUsers = "Администратор", "DefaultAccount", "DevToolsUser", "Гость", "sshd", "Пользователь", "WDAGUtilityAccount"
Получить-локальный пользователь | ? { $KeepUsers -notcontains $_.Name } | Удалить-локальный пользователь

Слева направо:

  1. Получить всех локальных пользователей.
  2. Передайте его в Where-Object( ?это псевдоним).
  3. Фильтровать только тех пользователей, чьи имена не отображаются в $KeepUsersмассиве.
  4. Перенаправляет недавно отфильтрованных пользователей в канал, в Remove-LocalUserкоторый их удаляет.

решение2

Попробуй это:

Get-WMIObject -Class Win32_UserAccount -Filter "LocalAccount='True'" | Where-Object {$_.Name -notin @("Administrator", "DefaultAccount", "DevToolsUser", "Guest", "sshd", "User", "WDAGUtilityAccount")} | Foreach {net user "$_.Name" /delete}
  • Сначала выведите список всех локальных учетных записей пользователей через WMI.
  • Затем используйте фильтр Where-Object, чтобы исключить учетные записи пользователей, которые нужно сохранить.
  • Затем передаем объекты в блок Foreach.
  • Теперь удалите учетные записи пользователей с помощью net user.

Сноски

  • Этот скрипт необходимо запускать с правами администратора.
  • Вы должны сделать это из учетной записи пользователя, чтобы не быть отмеченным для удаления.

решение3

Для этого случая на PowerShellGallery.com есть модуль PowerShell.

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
#>

В PowerShell v5x и PowerShell Core6x или выше.

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
#>

Так что вы можете просто сделать это...

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

То же самое можно сделать и для командлета Remove.

решение4

Удаление локальной учетной записи звучит как одна задача, но на самом деле она будет состоять как минимум из следующих трех шагов:

  1. Удалить учетную запись из локальной базы данных учетных записей
  2. Удалить каталог профилей этой учетной записи
  3. Удалить профиль учетной записи из реестра

Возможно, есть еще больше шагов, но я пока не нашел по ним документации. Поскольку нужно выполнить несколько шагов, вероятно, плохая идея использовать для этого слишком атомарные функции. Командлет Remove-LocalUserи netинструмент (с net user <username> /delete) являются такими атомарными функциями. Они предлагают удалить локального пользователя — что звучит хорошо — но на самом деле они (только) удаляют пользователя из локальной базы данных учетных записей пользователей. Этого может быть достаточно для некоторых сценариев, но имейте в виду, что ключи реестра и каталог профиля останутся!

Microsoft предлагает макрофункцию для полного удаления локальной учетной записи пользователя, к сожалению, только в GUI. Вы можете найти ее черезНастройки > Учетные записи > Семья и другие пользователи. Просто выберите пользователя и нажмите наУдалять, Затем наУдалить учетную запись и данные. Это позволит выполнить все три шага, описанные выше.

Также есть макрос-функция для (простого) удаления профиля пользователя. Вы можете открыть его черезПанель управления > Система > Дополнительные параметры системы > Настройки...(кнопка вПрофили пользователейпанель):

введите описание изображения здесь

Вы также можете открыть это окно напрямую, выполнив rundll32 sysdm.cpl,EditUserProfilesPowerShell с повышенными правами. Важно открыть это окно с правами администратора, чтобы увидеть все учетные записи пользователей, а не только собственную учетную запись (даже при открытии через GUI).

Удаление учетной записи пользователя через это окно приведет к выполнению шагов 2 и 3, описанных выше.

Хотите узнать, что это за два неизвестных аккаунта? Это остатки двух удаленных аккаунтов, один из которых был удален командлетом Remove-LocalUser, а другой — инструментом net.

Поскольку вы ищете решение PowerShell, мы можем выполнить по крайней мере три шага, описанных выше, вручную, если PowerShell не предоставляет командлет для выполнения всей работы одновременно:

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'

Эта функция готова к использованию в конвейере, поэтому вы можете удалить всех пользователей, кроме тех, кого хотите сохранить, следующим образом:

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

Но в настоящее время (в PS v5.1.18362.752) конвейер между Get-LocalUserи Remove-LocalUserимеет баг, что также повлияет на мою функцию выше. Следующий конвейер (без Remove-LocalUserCompletely) удалит только каждую вторую учетную запись пользователя из базы данных учетных записей, которые должны быть удалены:

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

Эту проблему можно обойти, используя цикл вместо конвейера (теперь с Remove-LocalUserCompletely):

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

Связанный контент