← 홈
Lab

윈도우 프로필(C:\Users) 한글 → 영어로 변경 방법

#Lab

안녕하세요 novice-22입니다.
이번 글은 윈도우 사용자 폴더(
C:\Users\한글이름)를 영어로 바꾼 과정을 정리한 글입니다. 한글 폴더가 왜 문제가 되는지부터 시작해서 레지스트리로 폴더 이름을 바꾸는 방법, 바꾼 뒤 남은 옛 경로를 정리하는 방법에 대해 작성하였습니다.

1. 한글 사용자 폴더

1-1 왜 문제가 되는가

윈도우를 설치할 때 계정 이름을 한글로 만들면 사용자 폴더도 C:\Users\홍길동처럼 한글로 만들어진다. 평소에는 문제가 없지만 개발 도구를 쓰기 시작하면 경로에 한글이 섞여 있어서 생기는 오류를 자주 만난다. Python 패키지, Node, Android SDK, 일부 설치 프로그램은 경로의 한글을 제대로 읽지 못해서 설치나 실행에 실패한다.

이 글에서는 예시로 C:\Users\홍길동을 C:\Users\newname으로 바꾼다. 명령어의 홍길동, newname, <SID>는 본인 환경에 맞게 바꿔서 사용하면 된다.

1-2 바꾸는 방법 두 가지

방법장점단점
영어 이름으로 새 계정 만들기가장 안전하다프로그램 설정을 처음부터 다시 해야 한다
레지스트리로 기존 폴더 이름 바꾸기계정, 프로그램, 설정이 그대로 유지된다옛 경로가 남은 곳을 직접 정리해야 한다

이번에는 개발 환경을 그대로 유지하고 싶어서 레지스트리로 바꾸는 방법을 선택했다. 레지스트리를 직접 수정하는 작업이라 복원 지점과 백업은 반드시 먼저 만들어야 한다.

1-3 기본 용어

SID

윈도우는 계정을 이름이 아니라 SID(보안 식별자)로 구분한다. S-1-5-21-...-1001처럼 생긴 고유한 값이다. 계정 이름이나 폴더 이름을 바꿔도 SID는 바뀌지 않는다.

ProfileList

윈도우가 각 계정의 사용자 폴더 위치를 기억하는 레지스트리 키다. SID별로 하위 키가 있고, 그 안의 ProfileImagePath 값이 사용자 폴더 경로다. 이 값과 실제 폴더 이름을 같이 바꾸는 것이 이번 작업의 핵심이다.

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\<SID>

교차점(Junction)

한 폴더를 다른 폴더로 연결하는 링크다. C:\Users\홍길동 교차점을 C:\Users\newname에 연결해두면, 옛 경로로 접근하는 프로그램도 새 폴더를 그대로 쓸 수 있다. 용량은 차지하지 않는다.


2. 사전 준비

2-1 복원 지점 만들기

Win → "복원 지점 만들기"를 실행한다. C: 드라이브의 보호가 "설정"인지 확인하고 만들기를 누른다. 문제가 생기면 이 시점으로 되돌릴 수 있다.

2-2 OneDrive 확인

바탕화면 폴더를 우클릭 → 속성 → 위치 탭에서 경로를 확인한다. 경로에 OneDrive가 들어 있으면 작업 전에 OneDrive 연결을 해제한다. 없으면 넘어가도 된다.

2-3 업데이트 일시 중지

작업 중간에 업데이트로 재시작되면 꼬일 수 있다. 설정 → Windows 업데이트에서 1주 정도 일시 중지해둔다.

2-4 BitLocker 확인

관리자 CMD에서 확인한다.

manage-bde -status C:
manage-bde -protectors -get C:

뒤에서 안전 모드로 들어갈 때 복구 키를 물어볼 수 있다. 48자리 복구 키를 따로 보관해둔다.


3. 폴더 이름 바꾸기

3-1 임시 관리자 계정 만들기

로그인한 계정의 사용자 폴더는 사용 중이라 바꿀 수 없다. 작업용으로 임시 관리자 계정을 하나 만든다. 관리자 CMD에서 실행한다.

net user tempadmin 임시비밀번호 /add
net localgroup Administrators tempadmin /add
whoami /user

whoami /user 결과에 나오는 현재 계정의 SID를 메모해둔다. 다음 단계에서 쓴다.

3-2 레지스트리 수정

재시작한 뒤 로그인 화면에서 tempadmin으로 로그인하고 regedit을 실행한다. 1-3의 ProfileList 경로에서 메모한 SID 키로 들어가서 ProfileImagePath 값을 바꾼다.

항목값
변경 전C:\Users\홍길동
변경 후C:\Users\newname

이 시점부터 폴더 이름을 바꾸기 전까지는 원래 계정으로 로그인하면 안 된다. 레지스트리는 새 경로를 가리키는데 폴더는 아직 옛 이름이라, 윈도우가 임시 프로필로 로그인시킨다.

3-3 안전 모드에서 폴더 이름 변경

일반 모드에서 ren을 실행하면 "액세스가 거부되었습니다"가 나왔다. 원래 계정에서 로그아웃해도 마찬가지였다. 백그라운드 서비스가 폴더를 잡고 있기 때문이다. 이럴 때는 서비스가 거의 뜨지 않는 안전 모드에서 진행하면 된다.

시작 → 전원 → Shift를 누른 채 다시 시작 → 문제 해결 → 고급 옵션 → 시작 설정 → 다시 시작 → 4를 누른다.

안전 모드로 부팅되면 tempadmin으로 로그인하고 관리자 CMD에서 실행한다.

ren "C:\Users\홍길동" newname
mklink /J "C:\Users\홍길동" "C:\Users\newname"
dir C:\Users

mklink /J로 1-3의 교차점을 만든다. dir 결과에 newname 폴더와 홍길동 [JUNCTION]이 보이면 성공이다.

레지스트리 값도 한 번 더 확인한다.

reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\<SID>" /v ProfileImagePath

확인이 끝나면 평소처럼 다시 시작한다. 시작 설정으로 들어간 안전 모드는 1회성이라 재시작하면 일반 모드로 부팅된다. 이제 원래 계정으로 로그인한다.

출처


4. 남은 경로 정리

폴더 이름은 바뀌었지만 여러 곳에 옛 경로가 남아 있다. 교차점 덕분에 당장은 동작하지만, 한글 경로 문제를 없애려면 정리해야 한다.

4-1 프로필 경로 확인

CMD에서 확인한다.

echo %USERPROFILE%
reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" | findstr /i "홍길동"
reg query "HKCU\Environment" | findstr /i "홍길동"

%USERPROFILE%이 C:\Users\newname이면 정상이다. 아래 두 줄에서 결과가 나오면 그 위치에 옛 경로가 남아 있는 것이다. 실제로 확인해보니 사용자 폴더 설정은 정상이었고, 사용자 환경변수 Path와 OneDrive에 옛 경로가 남아 있었다.

4-2 사용자 환경변수 정리

PowerShell(일반 권한)에서 실행한다.

reg export HKCU\Environment "$env:USERPROFILE\env_backup.reg" /y
$old = 'C:\Users\홍길동'
$p = (Get-Item 'HKCU:\Environment').GetValue('Path','',[Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames)
$new = ($p -split ';' | Where-Object {$_} | ForEach-Object { $_.Replace($old,'%USERPROFILE%') } | Select-Object -Unique) -join ';'
Set-ItemProperty 'HKCU:\Environment' -Name Path -Value $new -Type ExpandString
Set-ItemProperty 'HKCU:\Environment' -Name OneDrive -Value '%USERPROFILE%\OneDrive' -Type ExpandString
reg query HKCU\Environment
동작설명
reg export현재 값을 백업한다. 문제가 생기면 파일을 더블클릭해서 복원한다
Replace옛 경로를 %USERPROFILE%로 바꾼다. 다음에 폴더 이름이 바뀌어도 따라간다
Select-Object -Unique중복된 항목을 하나로 정리한다
-Type ExpandStringREG_EXPAND_SZ타입을 유지한다. 이 타입이어야 %USERPROFILE%이 해석된다

로그아웃했다가 다시 로그인해야 적용된다. 이후 자주 쓰는 도구가 정상인지 확인한다.

echo %PATH%
python --version
git --version
code --version
wsl -l -v

4-3 WSL, Docker 경로 정리

WSL 배포판의 디스크 위치도 레지스트리에 경로로 저장되어 있다.

reg query HKCU\Software\Microsoft\Windows\CurrentVersion\Lxss /s /v BasePath

옛 경로가 보이면 Docker Desktop을 종료하고 WSL을 내린 뒤 수정한다.

wsl --shutdown
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Lxss\{배포판GUID}" /v BasePath /t REG_SZ /d "C:\Users\newname\AppData\Local\wsl\{배포판GUID}" /f

Docker 항목은 \\?\C:\Users\newname\AppData\Local\Docker\wsl\main처럼 앞의 \\?\를 그대로 유지해야 한다. 수정한 뒤 wsl을 실행해서 정상으로 들어가는지 확인한다.

4-4 프로그램 설치 정보 정리

VS Code처럼 사용자 폴더에 설치되는 프로그램은 설치 위치를 레지스트리에 기억한다. 이 값이 옛 경로로 남아 있으면 업데이트할 때마다 옛 폴더를 만들려다 실패한다. 이 문제는 7-6에서 자세히 다룬다.

해당 프로그램을 종료하고 PowerShell(일반 권한)에서 실행한다.

reg export HKCU\Software\Microsoft\Windows\CurrentVersion\Uninstall "$env:USERPROFILE\uninstall_backup.reg" /y
$old='C:\Users\홍길동'; $new='C:\Users\newname'
Get-ChildItem 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Uninstall' | ForEach-Object {
  $key = $_
  foreach ($n in $key.GetValueNames()) {
    $v = $key.GetValue($n,$null,'DoNotExpandEnvironmentNames')
    if ($v -is [string] -and $v.Contains($old)) {
      Set-ItemProperty $key.PSPath -Name $n -Value $v.Replace($old,$new) -Type $key.GetValueKind($n)
      "$($key.PSChildName) : $n"
    }
  }
}

설치 정보 전체에서 옛 경로가 들어간 값만 찾아서 바꾸고, 바꾼 항목을 출력한다. 기존 값의 타입은 그대로 유지한다. VS Code뿐 아니라 Python, Ollama, Docker처럼 사용자 폴더에 설치된 프로그램이 한 번에 정리된다.

4-5 Claude Code 세션 기록 복구

Claude Code는 세션 기록을 %USERPROFILE%\.claude\projects 안에 프로젝트 경로별 폴더로 저장한다. 폴더 이름은 경로에서 영문과 숫자가 아닌 글자를 전부 -로 바꿔서 만든다.

경로세션 폴더 이름
C:\Users\홍길동\Desktop\my-projectc--Users-----Desktop-my-project
C:\Users\newname\Desktop\my-projectc--Users-newname-Desktop-my-project

한글 세 글자가 ---가 되고, 앞뒤의 \까지 더해져서 -----가 된다. 경로가 바뀌면 다른 폴더를 찾기 때문에 이전 세션이 목록에서 사라진다.

Claude Code와 VS Code를 종료하고, 옛 폴더를 새 이름으로 복사한다.

$p = "$env:USERPROFILE\.claude\projects"
Get-ChildItem $p -Directory | Where-Object Name -like '?--Users-----*' | ForEach-Object {
  $dst = Join-Path $p ($_.Name -replace '^(.)--Users-----', '$1--Users-newname-')
  New-Item $dst -ItemType Directory -Force | Out-Null
  Copy-Item "$($_.FullName)\*" $dst -Recurse -Force
  $dst
}

-----의 개수는 한글 이름 글자 수에 2를 더한 값이다. 이름이 두 글자라면 ----로 바꿔서 실행한다. 세션 파일은 고유 ID라 덮어쓰일 걱정은 없고, 원본 폴더는 남겨둔다.

4-6 기타 파일 확인

스크립트나 설정 파일에 경로를 직접 적어둔 경우도 있다.

findstr /i "홍길동" <확인할 파일>

결과가 나오면 메모장으로 열어서 고친다.


5. 임시 계정 정리

5-1 계정 삭제

관리자 CMD에서 계정을 지운다.

net user tempadmin /delete

폴더는 재시작한 뒤에 지운다. 재시작 전에는 "다른 프로세스가 파일을 사용 중"이라며 지워지지 않는다(7-3).

rmdir /s /q C:\Users\tempadmin

5-2 ProfileList 정리

계정을 지워도 ProfileList에 항목이 남는다. 관리자 PowerShell에서 정리한다.

$k = Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList' | Where-Object { $_.GetValue('ProfileImagePath') -eq 'C:\Users\tempadmin' }
$k.PSChildName
reg export "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\$($k.PSChildName)" "$env:USERPROFILE\tempadmin_profile_backup.reg" /y
Remove-Item $k.PSPath -Recurse

$k.PSChildName에서 출력된 SID가 원래 계정의 SID가 아닌지 반드시 확인한다. 재시작한 뒤 프로필 목록을 확인한다.

Get-CimInstance Win32_UserProfile | Select-Object LocalPath, SID

6. 계정 이름 변경 (선택)

폴더 경로와 계정 이름은 별개다. 폴더를 바꿔도 %USERNAME%은 여전히 한글이다. 계정 이름까지 영어로 바꾸려면 관리자 PowerShell에서 실행한다.

Rename-LocalUser -SID "<SID>" -NewName "newname"
Set-LocalUser -SID "<SID>" -FullName "newname"
Get-LocalUser -SID "<SID>" | Select-Object Name, FullName

-Name "홍길동"으로 지정하면 사용자를 찾지 못하는 경우가 있어서 SID로 지정했다(7-5). FullName은 로그인 화면에 보이는 이름이다. 비밀번호, PIN, 프로필은 그대로 유지된다.

로그아웃했다가 다시 로그인한 뒤 확인한다.

whoami
$env:USERNAME

출처


7. 겪은 문제와 해결

7-1 ren 실행 시 액세스 거부

관리자 CMD인데도 ren이 거부됐다. 원래 계정의 세션을 확인하려고 query user를 실행했지만 Windows 11 Home에는 없는 명령이었다. 작업 관리자의 사용자 탭에서 원래 계정을 로그아웃해도 마찬가지였다. 백그라운드 서비스가 폴더를 잡고 있었기 때문이고, 3-3처럼 안전 모드에서 진행해서 해결했다.

7-2 PowerShell에서 echo %USERNAME%이 그대로 출력된다

%USERNAME%은 CMD 문법이다. PowerShell에서는 $env:USERNAME으로 써야 한다.

7-3 임시 계정 폴더가 지워지지 않는다

tempadmin에서 로그아웃한 직후 폴더를 지우려 하자 NTUSER.DAT 등이 "다른 프로세스가 파일을 사용 중"이라며 지워지지 않았다. 로그아웃해도 윈도우가 계정의 레지스트리 하이브를 한동안 메모리에 올려두기 때문이다. 재시작한 뒤 지우면 된다.

7-4 사용자 프로필 창이 응답하지 않는다

sysdm.cpl → 고급 → 사용자 프로필 설정을 열자 창이 응답 없음 상태로 멈췄다. PowerShell로 프로필 목록을 확인하자 다음 오류가 났다.

Get-CimInstance : 계정 이름과 보안 식별자 사이에 매핑이 이루어지지 않았습니다.

삭제한 tempadmin 계정의 SID가 ProfileList에 남아 있어서 계정 이름으로 바꿀 수 없었던 것이다. 5-2처럼 항목을 지우고 재시작해서 해결했다.

7-5 Rename-LocalUser가 사용자를 찾지 못한다

Rename-LocalUser -Name "홍길동"을 실행하자 사용자를 찾지 못했다는 오류가 났다. 콘솔에 입력한 한글이 제대로 전달되지 않은 것으로 보인다. 6처럼 -SID로 지정해서 해결했다.

7-6 VS Code를 열 때마다 설치 오류가 뜬다

교차점을 지운 뒤 VS Code를 열 때마다 이런 창이 떴다.

"C:\Users\홍길동" 폴더를 만들 수 없습니다.
오류 5: 액세스가 거부되었습니다.

VS Code 업데이트 설치 프로그램이 레지스트리의 설치 정보에서 옛 설치 경로를 읽고 그 폴더를 만들려다 실패한 것이다. 4-4의 스크립트로 설치 정보의 경로를 바꿔서 해결했다. 교차점을 다시 만들어도 바로 해결된다.

7-7 Claude 앱의 폴더에 경고 표시가 뜬다

교차점을 지운 뒤 Claude 앱에 등록해둔 폴더 일부에 경고 표시가 떴다. 앱이 폴더를 옛 경로로 기억하고 있어서 경로를 찾지 못한 것이다. 교차점을 다시 만들고 앱을 재시작해서 해결했다.

7-8 Claude Code 이전 세션이 보이지 않는다

VS Code에서 Claude Code를 열자 이전 세션이 목록에 없었다. 세션 기록은 그대로 있었지만 새 경로 이름의 폴더를 찾고 있었다. 4-5처럼 세션 폴더를 새 이름으로 복사해서 해결했다.


8. 마무리

레지스트리의 ProfileImagePath와 폴더 이름을 같이 바꾸는 것만으로 계정과 프로그램을 그대로 둔 채 사용자 폴더를 영어로 바꿀 수 있었다. 생각보다 손이 많이 간 쪽은 바꾼 뒤의 정리였다. 환경변수, WSL, 프로그램 설치 정보, Claude Code 세션처럼 옛 경로를 따로 기억하는 곳이 많았다.

7-6과 7-7은 모두 교차점을 지운 뒤에 생긴 문제였다. 정리를 꼼꼼히 해도 어디선가 옛 경로를 쓰는 프로그램이 나올 수 있다. 교차점은 용량을 차지하지 않으니 지우지 않고 계속 두는 것이 좋다. 꼭 지워야 한다면 rmdir "C:\Users\홍길동"처럼 /s 없이 지워야 한다. /s를 붙이면 연결된 실제 폴더의 내용까지 지워질 수 있다.

작업 중에 만든 백업 파일(env_backup.reg, uninstall_backup.reg, tempadmin_profile_backup.reg)은 며칠 써보고 문제가 없으면 지운다. 마지막으로 2-3에서 일시 중지한 업데이트를 다시 켜면 끝이다.