모든 로컬 계정을 제거하는 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을 포함하지 않음 } | 제거-로컬사용자
왼쪽에서 오른쪽으로:
- 모든 로컬 사용자를 확보하십시오.
Where-Object
(?
는 별칭입니다) 에 파이프하세요 .- 사용자 이름이 배열에 표시되지 않는 사용자만 필터링합니다
$KeepUsers
. - 새로 필터링된 사용자를
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
로컬 계정 삭제는 하나의 작업처럼 들리지만 최소한 다음 세 단계로 구성됩니다.
- 로컬 계정 데이터베이스에서 계정 삭제
- 이 계정의 프로필 디렉터리 삭제
- 레지스트리에서 계정 프로필 삭제
더 많은 단계가 있을 수 있지만 지금까지 이에 대한 문서를 찾지 못했습니다. 수행해야 할 단계가 여러 개 있으므로 이를 위해 너무 원자적인 함수를 사용하는 것은 아마도 좋지 않은 생각일 것입니다. cmdlet Remove-LocalUser
과 net
도구( 포함 net user <username> /delete
)는 이러한 원자적 기능입니다. 그들은 로컬 사용자를 삭제하라고 제안합니다. 듣기에는 좋지만 실제로는 로컬 사용자 계정 데이터베이스에서 사용자를 삭제합니다. 일부 시나리오에서는 이 방법으로 충분할 수 있지만 레지스트리 키와 프로필 디렉터리는 그대로 유지됩니다.
Microsoft는 불행히도 GUI에서만 로컬 사용자 계정을 완전히 삭제하는 매크로 기능을 제공합니다. 통해 찾아보실 수 있습니다설정 > 계정 > 가족 및 기타 사용자. 사용자를 선택하고 클릭하세요.제거하다, 그런 다음계정 및 데이터 삭제. 그러면 위의 세 단계가 모두 수행됩니다.
사용자 프로필을 (그냥) 제거하는 매크로 기능도 있습니다. 다음을 통해 열 수 있습니다.제어판 > 시스템 > 고급 시스템 설정 > 설정...(버튼사용자 프로필패널):
rundll32 sysdm.cpl,EditUserProfiles
관리자 권한 PowerShell에서 실행하여 이 창을 직접 열 수도 있습니다 . 자신의 계정뿐만 아니라(GUI를 통해 여는 경우에도) 모든 사용자 계정을 보려면 관리 권한으로 이 창을 여는 것이 중요합니다.
이 창을 통해 사용자 계정을 삭제하면 위의 2단계와 3단계가 수행됩니다.
두 개의 알려지지 않은 계정이 무엇인지 궁금하십니까? 이는 두 개의 삭제된 계정( Remove-LocalUser
cmdlet에 의해 삭제된 계정과 도구에 의해 삭제된 계정) 의 잔해입니다 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
}