Azure AD管理下のWindowsアカウントでユーザーフォルダ名を変更する
動機
所属企業がAzure ADで業務用PCのアカウント管理をするようになったが、その際にユーザーフォルダのパス(USERPROFILE
)が変わり、非ASCII文字が含まれるようになったため、様々なソフトウェアがトラブルを起こすようになった。Azure ADアカウントの設定をユーザーが勝手に変えることは難しいようなので、運用で対処したり、OSSのものにはパッチを投げたりもしていた。
個別に対応していくうちに問題が起こらなくなるだろうと期待していたのだが、残念ながら新たなソフトウェアを使うたびに頻繁に新たなトラブルが起こり、導入から一年たった今でも悩みは解消しない。これ以上、業務でこの問題に付き合うことに耐えられないと思ったので、なんとか手段を講じてPCのユーザーフォルダ名をASCIIのみにしようと決めた。
基本方針
わたしの認識では、Azure AD下でユーザーフォルダ名を変更する「正規の」方法は提供されていない。
ユーザーフォルダのパスそのものはレジストリのただ一つのキー(後述)によって決まっている。しかし、変更前のパスはたいていレジストリのほかのキーやレジストリ外の様々な場所で既に使われており、それらも含めてすべて書き換える方針を取ると、網羅したという保証を得るのが難しい。
そこで、リンクを活用して元のパスも残しつつユーザープロファイルだけを変更することにした。
方針 1 (失敗)
このタスクに取り組む以前に、もともと既存のユーザーフォルダC:\Users\佐藤太郎
へのリンクをC:\Users\taro
として用意していた。非ASCIIパスで不具合が生じた場合に、後者のリンクを経由することができればそれで解決ということもあるからだ。
ここからさらにレジストリを弄って、USERPROFILEがC:\Users\taro
のほうを指すようにしたい。
手順
-
C:\Users\佐藤太郎
を指すディレクトリジャンクションC:\Users\taro
を作る。- PowerShellなら
New-Item -Type Junction -Path C:\Users\taro -Target C:\Users\佐藤太郎
など。管理者権限が必要。 - ディレクトリジャンクションとシンボリックリンクとの細かい違いがよくわかっていなかったが、ググった感じではどちらでもよさそうだった。とりあえず前者を選んだ。
- PowerShellなら
- Win+Rからregeditを起動する。
\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\{id}
のProfileImagePath
の値がC:\Users\佐藤太郎
になっていて、この値がUSERPROFILEを決めているようだ。ここをC:\Users\taro
に変更した。- バックアップのために、変更前にこのキーをエクスポートしておくこと。エクスポートしたファイルを開けばもとの値が復元される。
- Windowsを再起動する。
佐藤太郎
フォルダ自体はそのまま残っているので、様々なパス指定を探して出していちいちtaro
に変えなくてもすべてが壊れたりはしないはず……だが、とりあえず環境変数中のパスに登場するC:\Users\佐藤太郎
は直すことにした。Rapid Environment Editorで手動で直した。
トラブル
変更によって起きた問題を順にメモしていく予定だったが、2つ目のトラブルが致命的でこの方針自体を捨てた。
1つ目に、VSCodeでPythonファイルを開いてもPythonの拡張が起動しない。Developer toolsを開いて調べると、No matching bidings found for serviceIdentifier: Symbol(IComponentAdapter) というエラーが出ていた。Python extensionを削除してもう一回インストールすると直った。エラーの理由はわからなかったが、PylanceはMicrosoft社製品でしか使えないライセンスになっていて、起動時に環境を調べるのが影響しているかもしれない。
2つ目に、pyenv-winでPythonが新しくインストールできない問題が起こった。(インストール済みのPythonは使える。)pyenv install 3.10.9
などとすると、次のエラーが出た。
:: [Info] :: Mirror: https://www.python.org/ftp/python
:: [Installing] :: 3.10.9 ...
:: [Error] :: error installing "core" component MSI.
:: [Error] :: couldn't install 3.10.9
pyenv-winのissueに似たような事例があったので、スクリプトのインストールの部分から/quiet
オプションを消して実行してみると、PythonのMSIから次のエラーが出ていることがわかった。
Could not set file security for file 'C:\Users\taro\AppData\Roaming\Microsoft\Installer'. Error: 0. Verify that you have sufficient privileges to modify the security permissions for this file.
ググると結局cPythonのissueに行きついた。パスにジャンクションが含まれる場合に起こる、Windowsの権限に関する仕様(バグ?)とのこと。
この問題は致命的に見える。Pythonのインストールだけの障害ならほかの手段を探せばよさそうだが、ユーザーインストール一般において生じる問題ということだろう。上記issueにはパスにジャンクションが含まれる場合に起こると書かれていたので、C:\Users\taro
をシンボリックリンクに変えてみたが効果がなかった。いったんこの方針は捨てることにした。
方針 2
上の問題はリンクの関係を、taro → 佐藤太郎としたから起こるのであって、佐藤太郎 → taroなら問題ない可能性がある。このタスクを行う以前はC:\Users\taro
をリンクとしていたので変更が最小になるほうを選んだわけだが、逆のほうが自然ではある。
手順
以下の手順は方針1の実行前の状態から行うことを想定している。この手順は佐藤太郎とは別のアカウントを作ってそこから操作した。(佐藤太郎アカウントから操作した場合にどうなるかはわからない)
- ユーザーフォルダの名前を変更した上で、以前の名前からユーザーフォルダにJunctionを張る。なお、下の手順において、環境によっては
mv
で移動ができない可能性がある。この場合でもExplorerから手で名前変更するとできることがある。cd C:\Users mv 佐藤太郎 taro New-Item -Type Junction -Path C:\Users\佐藤太郎 -Target C:\Users\taro
- Win+Rからregeditを起動する。
\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\{id}
のProfileImagePath
の値をC:\Users\taro
に変更する。 - 再起動する。
トラブル
上と同じくVSCodeのPython拡張が起動しない問題が起こったので再インストールした。
そのまま1年以上使ったが、今のところ目立ったトラブルは起きていない。
Discussion