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에는 로컬 사용자 계정을 관리하기 위한 내장 cmdlet이 있으므로 사용자 지정 모듈보다 선호되어야 합니다(충분히 높은 버전의 PowerShell을 실행하는 경우).

$KeepUsers = "관리자", "DefaultAccount", "DevToolsUser", "Guest", "sshd", "사용자", "WDAGUtilityAccount"
Get-LocalUser | ? { $KeepUsers -$_.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

이 사용 사례에 대한 PowerShell 모듈이 PowerShellGallery.com에 있습니다.

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 cmdlet에 대해서도 동일한 작업을 수행할 수 있습니다.

답변4

로컬 계정 삭제는 하나의 작업처럼 들리지만 최소한 다음 세 단계로 구성됩니다.

  1. 로컬 계정 데이터베이스에서 계정 삭제
  2. 이 계정의 프로필 디렉터리 삭제
  3. 레지스트리에서 계정 프로필 삭제

더 많은 단계가 있을 수 있지만 지금까지 이에 대한 문서를 찾지 못했습니다. 수행해야 할 단계가 여러 개 있으므로 이를 위해 너무 원자적인 함수를 사용하는 것은 아마도 좋지 않은 생각일 것입니다. cmdlet Remove-LocalUsernet도구( 포함 net user <username> /delete)는 이러한 원자적 기능입니다. 그들은 로컬 사용자를 삭제하라고 제안합니다. 듣기에는 좋지만 실제로는 로컬 사용자 계정 데이터베이스에서 사용자를 삭제합니다. 일부 시나리오에서는 이 방법으로 충분할 수 있지만 레지스트리 키와 프로필 디렉터리는 그대로 유지됩니다.

Microsoft는 불행히도 GUI에서만 로컬 사용자 계정을 완전히 삭제하는 매크로 기능을 제공합니다. 통해 찾아보실 수 있습니다설정 > 계정 > 가족 및 기타 사용자. 사용자를 선택하고 클릭하세요.제거하다, 그런 다음계정 및 데이터 삭제. 그러면 위의 세 단계가 모두 수행됩니다.

사용자 프로필을 (그냥) 제거하는 매크로 기능도 있습니다. 다음을 통해 열 수 있습니다.제어판 > 시스템 > 고급 시스템 설정 > 설정...(버튼사용자 프로필패널):

여기에 이미지 설명을 입력하세요

rundll32 sysdm.cpl,EditUserProfiles관리자 권한 PowerShell에서 실행하여 이 창을 직접 열 수도 있습니다 . 자신의 계정뿐만 아니라(GUI를 통해 여는 경우에도) 모든 사용자 계정을 보려면 관리 권한으로 이 창을 여는 것이 중요합니다.

이 창을 통해 사용자 계정을 삭제하면 위의 2단계와 3단계가 수행됩니다.

두 개의 알려지지 않은 계정이 무엇인지 궁금하십니까? 이는 두 개의 삭제된 계정( Remove-LocalUsercmdlet에 의해 삭제된 계정과 도구에 의해 삭제된 계정) 의 잔해입니다 net.

PowerShell 솔루션을 찾고 있다면 PowerShell이 ​​모든 작업을 한 번에 수행하는 cmdlet을 제공하지 않는 한 최소한 위의 세 단계를 수동으로 수행할 수 있습니다.

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

Get-LocalUser그러나 현재(PS v5.1.18362.752) 와 사이의 파이프라인에 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
}

관련 정보