はじめに (対象読者・この記事でわかること)

この記事は、Windows環境でITインフラの管理やシステム運用に携わる方、あるいは特定の共有フォルダに管理者権限でアクセスする必要があるものの、その都度手動での割り当てに手間を感じている方を対象としています。

この記事を読むことで、WindowsのUAC(ユーザーアカウント制御)による制約を理解し、タスクスケジューラとPowershellを組み合わせることで、管理者権限を必要とするネットワークドライブをシステム起動時やログオン時に自動で割り当てる具体的な方法がわかるようになります。これにより、手動でのマッピング作業を削減し、日々の業務効率を大幅に向上させることができるでしょう。

前提知識

この記事を読み進める上で、以下の知識があるとスムーズです。 - Windowsの基本的な操作とシステム設定(コントロールパネル、設定アプリなど) - ネットワークドライブの概念と基本的な割り当て方法 - コマンドプロンプトまたはPowershellの基本的なコマンド操作

なぜ管理者権限が必要なネットワークドライブ割り当てが難しいのか?

Windows環境において、特定のサーバーやNAS上の共有フォルダには、セキュリティ上の理由から管理者権限でのアクセスが求められることがあります。しかし、一般的な方法でネットワークドライブを割り当てようとすると、UAC(ユーザーアカウント制御)の壁にぶつかり、期待通りに動作しないことがよくあります。

この問題の背景には、Windowsのセキュリティモデルがあります。UACが有効な環境では、標準ユーザーとしてログオンしている場合でも、管理者権限が必要な操作を実行する際には、別の「管理者セッション」でそのプロセスが実行されます。このセッション分離のため、標準ユーザーのコンテキストでマッピングされたネットワークドライブが管理者権限のプロセスからは見えなかったり、逆に管理者権限で割り当てたドライブが標準ユーザーのセテキストでは利用できなかったりといった現象が発生します。

特に、システムの起動時やユーザーログオン時に管理者権限を要求する共有フォルダを自動でマッピングしようとすると、このセッション分離が原因で「アクセスが拒否されました」や「ネットワークパスが見つかりません」といったエラーに遭遇しがちです。手動で毎回ドライブを割り当てるのは非効率的であり、この問題を解決し、再起動後も自動的かつ安全に管理者権限でのネットワークドライブ割り当てを実現する方法を本記事で詳しく解説していきます。

タスクスケジューラとPowershellで管理者権限ドライブを自動割り当て

ここでは、管理者権限を必要とするネットワークドライブを自動的に割り当てるための具体的な手順を解説します。WindowsのタスクスケジューラとPowershellスクリプトを組み合わせることで、この課題を克服します。

ステップ1: Powershellスクリプトの作成

まず、ネットワークドライブの割り当てを行うPowershellスクリプトを作成します。Powershellを使用する理由は、バッチファイルよりも柔軟性が高く、エラーハンドリングやセキュリティ面でのメリットがあるためです。

以下の内容を参考に、map_admin_drive.ps1 といった名前でファイルを作成し、任意の場所に保存してください(例: C:\Scripts\map_admin_drive.ps1)。

Powershell
# ドライブレター、共有パス、認証情報を設定します。 # ドメインユーザーの場合は「YourDomain\AdminUser」、ローカルユーザーの場合は「AdminUser」のように指定します。 $driveLetter = "Z:" $sharePath = "\\YourServerNameOrIP\YourAdminShare" $username = "YourDomain\AdminUser" # または ".\AdminUser" (ローカルユーザーの場合) $password = "YourAdminPassword" # セキュリティリスクを理解した上で記述してください # 既存のドライブ接続がある場合は切断します。 # これにより、再実行時に古い接続が残っていても問題なく再接続できます。 try { Get-PSDrive -Name $driveLetter -ErrorAction SilentlyContinue | Remove-PSDrive -ErrorAction Stop Write-Host "$driveLetter の既存の接続を切断しました。" } catch { # 接続が存在しなかった場合や切断失敗時 (通常はエラーではないため無視) Write-Host "$driveLetter は接続されていませんでした、または切断に問題はありませんでした。" } # ネットワークドライブを割り当てます。 # New-PSDrive を使用することで、UACによるセッション分離の影響を受けにくく、 # 管理者権限で実行されたPowershellセッション内で適切にドライブを割り当てます。 try { # ConvertTo-SecureString を使用してパスワードをセキュアな文字列に変換します。 # -AsPlainText -Force はテスト目的であり、本番環境ではパスワードファイルなどより安全な方法を推奨します。 $credential = New-Object System.Management.Automation.PSCredential($username, (ConvertTo-SecureString $password -AsPlainText -Force)) New-PSDrive -Name $driveLetter ` -PSProvider FileSystem ` -Root $sharePath ` -Credential $credential ` -Persist # -Persist オプションにより再起動後も接続を維持しようとしますが、タスクスケジューラで毎回実行することで確実性を高めます。 Write-Host "ネットワークドライブ $driveLetter に $sharePath を割り当てました。" } catch { Write-Warning "ネットワークドライブ $driveLetter の割り当てに失敗しました。エラー: $($_.Exception.Message)" } # スクリプトの実行終了をログに残すために、少し待機することもできます。 # Start-Sleep -Seconds 5

【重要】パスワードのセキュリティに関する注意点: 上記のスクリプトでは、簡潔さを優先してパスワードを平文で記述しています。これはセキュリティ上のリスクが非常に高いため、実際の運用環境では以下のようなより安全な方法を検討してください。 - ConvertTo-SecureStringConvertFrom-SecureString を使って暗号化されたパスワードファイルを作成し、スクリプトから読み込む。 - Windowsの資格情報マネージャーに認証情報を保存し、Powershellから呼び出す。 - スクリプト実行アカウントの権限を最小限にする。

ステップ2: タスクスケジューラの設定

次に、作成したPowershellスクリプトを管理者権限で自動実行するためのタスクをタスクスケジューラに登録します。

  1. タスクスケジューラの起動: Windowsの検索バーで「タスクスケジューラ」と入力し、アプリケーションを起動します。

  2. 新しいタスクの作成: タスクスケジューラライブラリの右側ペインにある「タスクの作成...」をクリックします。

  3. 全般タブの設定:

    • 名前: AdminNetworkDriveMapper など、分かりやすい名前を付けます。
    • 説明: 「管理者権限でネットワークドライブをZ:に割り当てる」など、タスクの目的を記述します。
    • セキュリティオプション:
      • ユーザーがログオンしているかどうかにかかわらず実行する」を選択します。これにより、ユーザーがログオフしていてもタスクが実行されます。
      • 最上位の特権で実行する」にチェックを入れます。これが管理者権限でスクリプトを実行するための最も重要な設定です。
      • ユーザーまたはグループ: 「変更」をクリックし、ドライブ割り当てに必要な管理者権限を持つアカウント(例: ローカルの管理者アカウント、またはドメインの管理者アカウント)を指定します。パスワードの入力を求められたら入力してください。
  4. トリガータブの設定:

    • 「新規...」をクリックして新しいトリガーを作成します。
    • タスクの開始:
      • ログオン時」を選択します。これはユーザーがログインした際にスクリプトを実行します。
      • または「システムの起動時」を選択すると、システムが起動した際に実行されます(ユーザーがログインしていなくても実行されるため、より確実性が高いですが、ログインしたユーザーセッションからドライブが見えない可能性があります。今回は「ログオン時」と「最上位の特権」の組み合わせでユーザーセッションにドライブを割り当てます)。
    • 遅延時間: ネットワークの初期化が完了するまでに時間がかかる場合があるため、「タスクの遅延」を 30秒 から 1分 程度に設定することをお勧めします。
    • その他の設定は必要に応じて調整してください。
  5. 操作タブの設定:

    • 「新規...」をクリックして新しい操作を作成します。
    • 操作: 「プログラムの開始」を選択します。
    • プログラム/スクリプト: powershell.exe と入力します。
    • 引数の追加(オプション): -NoProfile -ExecutionPolicy Bypass -File "C:\Scripts\map_admin_drive.ps1"
      • -NoProfile: Powershellのプロファイル読み込みをスキップし、起動を高速化します。
      • -ExecutionPolicy Bypass: スクリプトの実行ポリシーを一時的にバイパスし、スクリプトがブロックされないようにします。
      • -File "C:\Scripts\map_admin_drive.ps1": 作成したPowershellスクリプトのフルパスを指定します。
  6. 条件タブの設定:

    • 必要に応じて、タスクを実行する条件を設定します。例えば、「コンピューターをAC電源で使用している場合のみタスクを開始する」など。通常、今回はデフォルトのままで問題ありません。
  7. 設定タブの設定:

    • 「タスクを要求に応じてすぐに実行する」にチェックを入れておくと、タスクの実行に失敗した場合に再試行されます。
    • その他の設定も必要に応じて調整してください。
  8. タスクの保存: 「OK」をクリックしてタスクを保存します。指定したユーザーアカウントのパスワードを再度求められる場合がありますので入力してください。

ハマった点やエラー解決

UACの壁とセッション分離

  • 現象: タスクスケジューラで「最上位の特権で実行」にチェックを入れても、net use コマンドで割り当てたドライブがエクスプローラーに表示されない、またはアクセスできない。
  • 原因: net use コマンドは、Powershellが管理者権限で実行されていても、通常のユーザーセッションにドライブを割り当てることができない場合があります。これはUACによるセッション分離の影響です。管理者セッションで割り当てたドライブは、標準ユーザーセッションからは見えないことがあります。
  • 解決策: Powershellのネイティブコマンドレットである New-PSDrive を使用します。New-PSDrive はPowershellのセッション内でドライブを定義するため、タスクスケジューラで「最上位の特権で実行」を設定し、Powershellを介して実行することで、ログインしているユーザーのセッション(管理者権限で実行されたPowershellセッション)にドライブを割り当てることができます。本記事のスクリプトではこの方法を採用しています。

パスワードの平文記述とセキュリティリスク

  • 現象: スクリプト内にパスワードを平文で記述すると、セキュリティ監査で指摘される、または情報漏洩のリスクがある。
  • 原因: プレーンテキストでパスワードがファイルに保存されているため。
  • 解決策: 上述の「【重要】パスワードのセキュリティに関する注意点」を参照し、ConvertTo-SecureStringConvertFrom-SecureString を利用した暗号化ファイルや、Windows資格情報マネージャーを活用するなど、より安全な認証情報管理方法を導入してください。

ネットワークの遅延による接続失敗

  • 現象: システム起動直後やログオン直後にタスクが実行されると、「指定されたネットワーク名では現在使用できません」などのエラーでドライブ割り当てが失敗する。
  • 原因: タスクの実行が早すぎて、ネットワークアダプターの初期化や認証サービスの起動が間に合っていないため。
  • 解決策: タスクスケジューラのトリガー設定で「タスクの遅延」を 30秒1分 程度に設定することで、ネットワークが完全に利用可能になるまで待機させることができます。また、Powershellスクリプトの冒頭に Start-Sleep -Seconds 10 のようなコマンドを追加して、スクリプト自体の実行を遅らせることも有効です。

まとめ

本記事では、Windows環境で管理者権限を必要とするネットワークドライブの自動割り当てを、タスクスケジューラとPowershellを組み合わせて実現する方法 を解説しました。

  • UACとセッション分離の理解: 通常の net use コマンドでは難しい管理者権限でのドライブ割り当ては、Windowsのセキュリティモデル、特にUACによるセッション分離が原因であることを理解しました。
  • Powershell New-PSDrive の活用: この課題を克服するために、Powershellの New-PSDrive コマンドレットを「最上位の特権で実行」されるタスクスケジューラから利用する手法が有効であることを示しました。
  • タスクスケジューラの詳細設定: タスクの「全般」タブでの「最上位の特権で実行」設定、適切な実行ユーザーアカウントの選択、「トリガー」での遅延設定、「操作」でのPowershellスクリプトの実行方法が成功の鍵であることを確認しました。

この記事を通して、手動でのネットワークドライブ割り当ての手間を解消し、より効率的で安全なシステム運用の一助となれば幸いです。

今後は、パスワードのよりセキュアな管理方法(資格情報マネージャーとの連携など)や、複数ドライブの一括割り当て、ログ記録の強化といった発展的な内容についても記事にする予定です。

参考資料