Windowsの設定を進めていて Dropboxからいろいろシンボリックリンクを貼ったりする作業があったのですが、 これが一筋縄でいかなかった件。
Windows 10でのシンボリックリンク
Windows 10マシンを手に入れていろいろ作業していたんですが、 Cygwinを使ってシンボリックリンクを作りながら 作業を進めてく部分で詰まりました。
ちなみにWindows 10 Homeです。
Cygwinで普通にln -s
をするとUnixなシンボリックリンクになって
Windowsのエクスプローラーとかから見てメモ帳で開くと
まともに内容が見れません1。
一方、Windowsではショートカットが作れますが、 これはCygwin側から見ると~.lnkみたいな名前になって Vimとかで無理やり開くとこれまたリンク先の内容ではなく バイナリファイルみたいな感じで文字化けが見えます。
しかし、Windowsにも実はシンボリックリンクがあって、 これを使うとWindows側からでもCygwin側からでも 同様にリンクとして見ることができます。
使い方としては上にあるように
- コマンドプロンプトから
mklink
コマンドを使う。 - Link Shell Extensionのようなソフトを入れてWindows側から作る。
- Cygwinから
cmd /c mklink ...
と、cmd
コマンドを使ってmklink
を呼び出す。 - Cygwinで
export CYGWIN=winsymlinks:native
(もしくはwinsymlinks:nativestrict
)を設定してln -s
でシンボリックリンクを作る。
といった方法があります。
で、この辺でシンボリックリンクを作ろうとしたところ、何やらエラーが出て 作れません。
追記: 2017/08/20
今やってみるとどの方法も管理者権限でなくても実行できます。 何か設定しては居ないと思うのですが、 何か変更したのか、それともWindows側で変更があったか、 もしくはCygwinで変更あった。。。?
追記ここまで
Cgwinでまだ日本語表示できるようにしてない中、
mklink
が日本語エラーを返してなんだかわからない状態。。。
コマンドプロンプトから直接mklink
してみると、
まず
この操作を実行するための十分な特権がありません。
と2。Windows 7な環境では通常ユーザーでも出来るのですが。 (Windows 10でも普段使うユーザーは管理者に割り当てられています。)
そこでコマンドプロンプトを管理者として実行で立ち上げてmklink
してみると
シンボリックリンクを作ることができました。
ちなみにコマンドプロンプトはスタートボタンを右クリックして出てくるメニューからも 起動でき、さらにそこにはコマンドプロンプト(管理者)という 管理者として起動できるメニューもあるのでこれを使うと便利です。
どうもユーザーレベルで使用する場合、管理者であっても シンボリックリンクを作ることはできないようになってるみたいです。
runasを使って管理者権限で実行する
コマンドプロンプト上での実行ですが、
通常ユーザーとして起動した場合でも
Administratorとしてコマンドを実行できるrunas.exe
というコマンドがあります。
Unix/Linuxのsudo
的なコマンドです。
この際、Windows 10だとAdministratorが有効になっていないので、まず 有効にしてパスワードを設定する必要があります。
コマンドプロンプトを管理者として実行し立ち上げ、
> net user administrator /active:yes
というコマンドを打ちます。
これでAdministratorが有効になったので、 パスワードを設定しておきます。 (最初は空でからのままだと使えない。)
> net user administrator *
とするとパスワードを聞かれるので設定します。
設定が終わったら、今度は普通にコマンドプロンプトを直接起動して、
> runas /user:administrator "cmd /C mklink /D newlink original"
の様に実行してあげるとAdministrator
として
cmd.exe
(つまりコマンドプロンプト)を実行し、
その中でmklink
を行いリンクを作成することができます。
少し話がずれますが、administrator
は大文字でも一部小文字でもOK。基本、コマンドとかも
大文字小文字関係ありません。
ファイルでも区別しないのと同様。
このコマンドではコマンドプロンプトを実行するので一瞬Windowが出てきます。
runas
で直接
> runas /user:administrator "mklink /D newlink original"
とコマンドを実行しようとすると
2: 指定されたファイルが見つかりません。
と出て3実行できないので一度cmd /c
を挟む必要があります。
どうもrunas
で実行するのはコマンドプロンプトで使うコマンドではなくて
プログラムの様。
また、この例の様に実行するコマンドに引数がつくような場合は
(cmd
を使う場合には必ず)クォートする必要があります。
runas
を使うときにそのまま使えば、的なものも見受けられますが、
これらはおそらくきちんと試してないか、
また、runas /user:administrator cmd
とcmd
だけを書いてるのを最初
cmd
を自分のやりたいコマンドに置き換えろ、という意味だと思ってましたが、
おそらくそうではなくてそのままcmd
だけで実行すると
管理者権限のコマンドプロンプトが立ち上がるのでそうしろ、ということなのでしょう。
このようにcmd /c
を使ってコマンドを実行するのは
Windowsでは常套手段っぽい感じです。
windows - mklink error in visual studios/webdev - Stack Overflow
Cygwinからでも
$ cmd /c mklink /D newlink original
とできます。
Cygwinからシンボリックリンクを作る
Cygwinでも管理者権限で立ち上げれば、上のcmd /c
を使うか、
もしくはwinsymlinks:native
が指定してあればln -s
で普通にシンボリックリンクを作れば
Windows側でもシンボリックリンクになります。
普通にCygwinを立ち上げた時にCygwinからWindowsのシンボリックリンクを作りたい時にどうするか。
上のrunas
をなんとか使ってみようとすると、まず、
cygwinにもrunas.exe
コマンドがあることに気づきました。
これを使ってみると
$ runas /user:administrator "cmd /C mklink /D newlink original"
Enter the password for administrator:
$
と、パスワードを聞くプロンプトは出るのですがそこで止まらず コマンドが終了してしまいました。
これをさらに
$ cmd /c runas /user:administrator "cmd /C mklink /D newlink original"
みたいにしてもダメでした。
$ cmd /c runas /user:administrator cmd
みたいにcmd
だけ呼ぼうとしても同じ状態。
で、ちょっとまた探してたらCygwinにはcygstart
というコマンドがあって、
$ cygstart --action=runas cmd
とすると管理者としてコマンドプロンプトが実行できます。 ただし、この場合開くディレクトリがC:\WINDOWS\system32になります。 なのでリンクを作ろうとして相対パスで、
$ cygstart --action=runas cmd /C mklink /D newlink original
とかするとC:\WINDOWS\system32にリンクができてしまいます。
$ cygstart --action=runas cmd /C mklink /D "C:\cygwin64\home\user\newlink" "C:\cygwin64\home\user\original"
とかすれば行けそうな感じなんですが、これもうまく行きませんでした。
ということでこの辺のコマンドでは今のところ上手く行ってません。
そんな中、そもそも管理者となってるユーザーのプロセスで シンボリックリンクが作れない状態をなんとかできないか、と言うことで 次のようなことをしてみました。
シンボリック権限を割り当てる
調べてくとこんなものが。
filesystems - Using windows mklink for linking 2 files - Stack Overflow
SeCreateSymbolicLinkPrivilege
という権限が与えられてないから、ということ。
これはgedit.msc
(ローカルグループポリシーエディター)
を使うか、cygwinを使っているなら
editright
というコマンドを使って変更できるとあります。
ただ、このgedit
なんですが、Windowsの
Pro版だと入っているんですがHome版だと入っていません。
(XPとかでもそうみたい。)
Home/Proの違いを感じることはほとんどありませんがこの辺の管理ツールとかが違う訳です。
この辺見るとMMC(Microsoft 管理コンソール)から追加できる、と言った感じですが、 このMMCは存在しますが中でローカルグループポリシーエディタは 存在しませんでした。
ですが、やはりそういった物を可能にするソフトが存在します。
下のリンク先の説明にしたがってインストールすればgeditが使える様になるはずです。
ちょっと補足として、 途中のNOTE 1でWindows 7 64-bit (x64)の人用の注意がありますが、 Windows 10でも64-bitなら該当します。 ここでGtoupPlicyフォルダのコピーをするのですが、これが 隠しフォルダになっているのでエクスプローラーで隠しファイルを表示する設定に しておく必要があります。
また、ユーザー名に空白が含まれてたりすると、 geditを立ち上げてもスナップイン作成できませんでした。(MMC could not create the snap-in.) 的なエラーが出る可能性があります。
この時、
C:\Windows\Temp\gpedit\x64.batを編集しないといけない可能性がありますが、
編集するとき、
ダブルクリックではbat
ファイルなのでそのまま実行しようとするので、右クリックから
編集を選ばないといけないわけですが、
このファイルは管理者のみが編集できるもので、
右クリックからは管理者として編集的なメニューはありません。
そこで、メモ帳を管理者として実行し、ファイル開く でこのファイルを開いて編集します。
また、installer.exeを管理者として実行しなくてはいけないのですが、 アクセス許可がないためにできない状態になっています。 そこで、右クリックからプロパティを表示させ、 セキュリティ タブ詳細設定 へ行き、自分のユーザーをフルコントロールを許可した状態で加えます。 これで管理者として実行できるはずです。
インストールできたらgeditを立ち上げて、 Local Computer Policy Computer Configuration Windows Settings** セキュリティの設定(Security Settings)** ローカルポリシー(Local Policies)** ユーザー権利の割当(User Rights Assignment** シンボリックリンクの作成(Create symbolic links** へ行き、自分のユーザーアカウントを追加します。
初期値ではAdministratorsだけが入ってると思います。
Administratorsが入ってれば良いような気がするんですが。
で、これでgeditは使える様になったんですが、肝心のシンボリックリンクは これをしても通常のコマンドプロンプトなどからは作ることはできませんでした。
きちんと一回ログアウトして入り直したりしてもダメ。
上のリンクにあるもう一つの方法のeditrights
は、
通常ユーザーでCygwinを立ち上げて行うと、
$ editrights.exe -a SeCreateSymbolicLinkPrivilege -u user
Error in openPolicy (LsaOpenPolicy returned 0xc0000022=unknown status code)!
と怒られるので、Cygwinを管理者として実行して行い、
$ editrights.exe -u user -l
$ editrights.exe -a SeCreateSymbolicLinkPrivilege -u user
$ editrights.exe -u user -l
SeCreateSymbolicLinkPrivilege
と登録できたっぽいのですが、そもそもいま追加したものだけが表示されてる状態。 また、geditの方で登録したつもりなのにここには反映されてない。
で、これを行ってログインしなおして行ってみましたがやはり状況は変わらず。
ここまで来て、Windowsのユーザーアカウント制御(UAC)が制限をしている、 という話を見つけたのでそれを変更してみることに。
How can I create symbolic links in Windows 8.1 without an admin command prompt? - Super User
UACはWindowsの昔ながらのコントロールパネルから変更できます。 コントロールパネルを開くにはスタートボタンを右クリックして 出てきたメニューからコントロールパネルを選びます。
ユーザーアカウント ユーザーアカウント ユーザーアカウントの制御設定の変更 へ行って設定を一番低くしてみます。
が、やはりこれでもダメでした。 (そもそも上のリンクの話では、 SeCreateSymbolicLinkPrivilege権限を個別に与えるかもしくはUACを切るか、 という話なので。)
実はこれだけではUACは完全には無効になっておらず、 レジストリをいじって完全に無効にする方法もないわけではないようです。
これは試していませんが。
色々格闘してみましたが、結局のところ Cygwinを管理者として実行しないかぎり、 Cygwin上からWindowsのシンボリックリンクを作ることはできない、 という感じになっています。
特に必要なのは最初の設定ファイルの配置とかだけなのでとりあえずは仕方ないかな、 といった感じ。