rcmdnk's blog
Last update

20160207_gedit_200_200

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を使うときにそのまま使えば、的なものも見受けられますが、

windows 7 - Got not sufficient privileges message in CMD when logged on as administrator - Super User

これらはおそらくきちんと試してないか、 また、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は存在しますが中でローカルグループポリシーエディタは 存在しませんでした。

ですが、やはりそういった物を可能にするソフトが存在します。

Add GPEDIT.msc by Drudger on DeviantArt

How to Enable “Group Policy Editor” (gpedit.msc) in Home and Starter Editions of Windows 7 and Later - AskVG

下のリンク先の説明にしたがってインストールすればgeditが使える様になるはずです。

ちょっと補足として、 途中のNOTE 1でWindows 7 64-bit (x64)の人用の注意がありますが、 Windows 10でも64-bitなら該当します。 ここでGtoupPlicyフォルダのコピーをするのですが、これが 隠しフォルダになっているのでエクスプローラーで隠しファイルを表示する設定に しておく必要があります。

20160207_explolar.png

また、ユーザー名に空白が含まれてたりすると、 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だけが入ってると思います。

20160207_gedit.jpg

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は完全には無効になっておらず、 レジストリをいじって完全に無効にする方法もないわけではないようです。

Windows10でUACを完全に無効にする - シュレ猫のぶろぐ

これは試していませんが。

色々格闘してみましたが、結局のところ Cygwinを管理者として実行しないかぎり、 Cygwin上からWindowsのシンボリックリンクを作ることはできない、 という感じになっています。

特に必要なのは最初の設定ファイルの配置とかだけなのでとりあえずは仕方ないかな、 といった感じ。

Sponsored Links
  1. バイナリなファイルとして認識されてて無理やり開くと元ファイルへのリンク、 みたいな文字化けな文字列が見れます。 ↩

  2. 英語環境なら

    You do not have sufficient privilege to perform this operation.
    

    ↩

  3. 英語なら

    The system cannot find the file specified
    

    ↩

Sponsored Links

« Copy.comのサービス終了でオンラインストレージ使用について考えてみる Windows 10用に追加したAutoHotkeyの設定 »

}