管理者権限のあるコマンドプロンプトからマップしたドライブにアクセスする:Tech TIPS
UACが利用されている環境でコマンドプロンプトを管理者権限で起動した場合、マップしたはずのネットワークドライブへアクセスできないことがある。これはUACによるセキュリティ機能が働いているためだ。このような場合の対処方法は?
対象OS:Windows Vista/Windows 7/Windows 8/Windows 8.1/Windows Server 2008/Windows Server 2008 R2/Windows Server 2012/Windows Server 2012 R2
解説
リモートのサーバー上の共有フォルダーにアクセスする場合、アクセスしやすくするためにUNCをドライブ名にマップして利用することがある。特にコマンドプロンプト上で作業する場合は、何らかのドライブ名にマップしておかないとパス名が長くなって面倒だし、UNC形式のまま指定するとエラーが生じるコマンドもあるからだ。
マップされたドライブをコマンドプロンプト上で利用する場合、通常のコマンドプロンプトでは正しく利用できるが、UACによる管理者権限で起動したコマンドプロンプト上ではエラーとなって接続できないことがある(コマンドプロンプトを管理者権限で実行させる方法は関連記事参照)。例えば以下は、UACが有効なWindows 7上で、通常のコマンドプロンプトと、UACによって昇格した管理者権限のコマンドプロンプト上で同じ操作を行ったところである。
コマンドプロンプトからマップしたドライブにアクセスする
通常起動したコマンドプロンプトではマップされたドライブにアクセスできるが、管理者権限で起動したコマンドプロンプトでは同じ操作をしてもエラーとなる。これはUACによるセキュリティ機能が働いているためである。
(1)通常権限で起動したコマンドプロンプト。
(2)マップされたドライブの一覧を表示させてみる。
(3)すべて接続済み。
(4)ドライブ名とアクセス先のUNCによる表記。
(5)マップされたドライブの1つの内容を確認する。
(6)結果。正しくアクセスできている。
(7)管理者権限で起動されたコマンドプロンプト。UACによる許可ダイアログには[はい]と答えて起動している。
(8)マップされたドライブ名の一覧を表示させてみる。
(9)すべて「利用不可」となっている。なおWindows 8やWindows Server 2012以降では「利用不可」のドライブは表示されず、「一覧にエントリが存在しません。」とだけ表示される。
(10)マップされたドライブにはアクセスできない。
管理者権限のコマンドプロンプトでは、マップしたドライブ名は見えているものの、アクセスしようとしてもエラーとなっている。コマンドプロンプト以外でも、UACによって昇格したアプリケーションやインストーラー、ログオンスクリプトなど、いくつかのケースでマップしているはずのドライブ名にアクセスできない症状が発生することがある。
このような現象が起こるのは、通常のコマンドプロンプトやアプリケーションなどのプロセスとUACによって昇格されたプロセス(正確には通常のユーザーセッションと、昇格されたユーザーセッション)では異なる権限を持ち、それが引き継がれないためである。
- 「Mapped drives are not available from an elevated prompt when UAC is configured to "Prompt for credentials" in Windows」[英語](サポート技術情報)
- 「Programs may be unable to access some network locations after you turn on User Account Control in Windows Vista or newer operating systems」[英語](サポート技術情報)
- 「管理者権限での実行を制限するユーザー・アカウント制御UAC」(連載 Vistaの地平)
本TIPSではこの現象を回避する方法を紹介する。
操作方法
UACによって昇格されたコマンドプロンプトなどでマップされたネットワークドライブにアクセスできるようにするには、いくつか方法がある。もちろんUACを無効にするという方法もあるが、システムの安全性が著しく損なわれるので避けるべきである。
●方法1―UNCによる表記を利用する
マップされたドライブ名ではアクセスできないが、そのマップした元のUNCによる表記ならそのまま利用できる。バッチファイルなどを使っている場合は、ドライブ名表記をUNCによる表記に変更するとよい。
※Windows 7での実行例
C:\Windows\system32>dir p:hiro* ……P:ドライブにアクセスしてみる
指定されたパスが見つかりません。 ……エラーになる
C:\Windows\system32>net use p: ……P:のマップ先を調べる
ローカル名 p:
リモート名 \\SERVER1\usr ……マップ先のUNC表記
リソースの種類 Disk
コマンドは正常に終了しました。
C:\Windows\system32>dir \\server1\usr\hiro* ……UNCでアクセスしてみる
ドライブ \\server1\usr のボリューム ラベルは User です
ボリューム シリアル番号は 2075-AED1 です
\\server1\usr のディレクトリ
2015/02/19 12:02 <DIR> hiroy ……正しくアクセスできた
0 個のファイル 0 バイト
1 個のディレクトリ 495,443,570,688 バイトの空き領域
C:\Windows\system32>
●方法2―ドライブにマップし直してから使う
直接ローカルドライブ名を使うことはできないが、net useコマンドでもう一度同じドライブ名にマップし直してから使ってもよい。
※Windows 7での実行例
C:\Windows\system32>dir p:hiro* ……P:ドライブにアクセスしてみる
指定されたパスが見つかりません。 ……エラーになる
C:\Windows\system32>net use p: \\server1\usr ……同じドライブ名とUNCで再マップしてみる
コマンドは正常に終了しました。 ……マップできた
C:\Windows\system32>dir p:hiro* ……再マップしたドライブ名でアクセスしてみる
ドライブ P のボリューム ラベルは User です
ボリューム シリアル番号は 2075-AED1 です
P:\ のディレクトリ
2015/02/19 12:02 <DIR> hiroy ……正しくアクセスできた
0 個のファイル 0 バイト
1 個のディレクトリ 495,443,570,688 バイトの空き領域
C:\Windows\system32>net use ……マップの状態を確認する
新しい接続は記憶されます。
ステータス ローカル名 リモート名 ネットワーク名
--------------------------------------------------------
OK P: \\server1\usr Microsoft Windows Network ……再マップされ、ステータスがOKになっている
利用不可 Q: \\SERVER1\pub Microsoft Windows Network ……他のドライブはまだ利用不可のまま。
利用不可 R: \\SERVER1\prj Microsoft Windows Network
利用不可 X: \\HVSERVER2\D Microsoft Windows Network
コマンドは正常に終了しました。
C:\Windows\system32>
※注:Windows 8/8.1/Windows Server 2012/Windows Server 2012 R2の「net use」コマンドでは、「ステータス」が「利用不可」になっているドライブの情報は表示されない。だが「net use p:」のようにすれば、個別のドライブの情報を確認することはできる。
net useコマンドを使わずとも、例えば管理者権限のコマンドプロンプトからメモ帳を起動してファイルの「開く」ダイアログを表示させ、そこでマップされたドライブ名をダブルクリックして自動マウントしてもよい。
ファイルのオープンダイアログを使ったマウント
これはWindows 7での実行例。GUIのオープンダイアログでは、そのままドライブ名をダブルクリックするだけで、自動的に再マウントできる。
※Windows 8/8.1/Windows Server 2012/Windows Server 2012 R2の場合は、マップされていないドライブはそもそも「ネットワークの場所」には表示されないので、この方法は使えない。
(1)管理者権限のコマンドプロンプトからメモ帳(notepad)を起動してみる。
(2)メモ帳の[ファイル]−[開く]を実行する。
(3)利用不可のドライブはこのように表示されているが、ダブルクリックすると自動的にマウントされ、以後はすぐにアクセスできるようになる。
いったん再マップされたら、以後はログアウト(サインアウト)しない限り、このコマンドプロンプトだけでなく、昇格した他のコマンドプロンプトやアプリケーションからでもローカルドライブ名でアクセスできるようになる。
●方法3―レジストリで設定を変更する
「EnableLinkedConnections」というレジストリ値を設定すると、通常権限でアクセスしていたドライブの接続情報が管理者権限で起動したプロンプト(セッション)にも引き継がれ、どちらのコマンドプロンプト(プロセス)でも同じようにアクセスできるようになる。
ただしこのような設定変更は、意図しないプログラムなどにネットワークドライブへの無制限なアクセスを許すことになり、UACによるセキュリティメカニズムを無意味にしかねない。その意味や影響を十分理解して利用していただきたい。
[注意]
レジストリに不正な値を書き込んでしまうと、システムに重大な障害を及ぼし、最悪の場合、システムの再インストールを余儀なくされることもあります。レジストリエディターの操作は慎重に行うとともに、あくまで御自分のリスクで設定を行ってください。何らかの障害が発生した場合でも、本Windows Server Insider編集部では責任を負いかねます。ご了承ください。
項目 | 内容 |
---|---|
キー | HKEY_LOCAL_MACHINE\の SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System |
値の名前 | EnableLinkedConnections(新規作成する) |
型 | REG_DWORD |
値の内容 | 1 |
昇格したコマンドプロンプトなどでマップされたドライブを有効にするための設定 注:Windows 8/Windows Server 2012の場合は、サポート技術情報「Windows 8 へ EnableLinkedConnections を正しく構成できない」の更新プログラムか、最新のWindows Updateを適用しておくこと。 |
この値を設定後、いったんシステムを再起動する。
■この記事と関連性の高い別の記事
- Windows Vistaでプログラムを管理者モードで実行する(UACによって制限されたプログラムを昇格させて実行する)(TIPS)
- プログラムを[プログラムとファイルの検索]の入力ボックスから管理者モードで実行する(TIPS)
- 共有フォルダのサブフォルダをマップする(TIPS)
- Windowsのユーザーアカウント制御(UAC)を一時的に無効にする(TIPS)
- コマンド・プロンプトでファイル共有を管理する(TIPS)
Copyright© Digital Advantage Corp. All Rights Reserved.