ユーザーログオフ時にタスクスケジューラでネットワークドライブにrobocopyに失敗するという内容ですが、あるユーザーにネットワークドライブの割り当てを行い、robocopyのタスクを実行したら失敗する事象がありました。
まず、ネットワークドライブの割り当てをユーザーで行った場合は、そのユーザーがログオンしていて、タスクスケジューラの設定もログオン時に実行するように設定する必要があります。
では、ユーザーがログオフ時にリモートファイルサーバの共有フォルダに対して、ネットワークドライブの割り当てを行って、そこにrobocopyしたい場合はどうすればいいか調べていたら以下のサイトが参考になりました。
タスクスケジューラジョブがマップされたネットワークドライブにアクセスできないのはなぜですか?
ttps://qastack.jp/superuser/640962/why-cant-a-task-scheduler-job-access-a-mapped-network-drive
質問内容です。
ローカルファイルをネットワーク共有にバックアップするためにRobocopyを実行するタスクスケジューラジョブがあります。ネットワーク共有にアクセスするにはドメイン資格情報を使用する必要がありますが、ローカルコンピューターはドメイン上になく、ジョブはローカル管理者として実行されます。このソリューションネットワーク共有の一時的なマッピングとマッピング解除は機能しますが、タスクスケジューラのジョブアクションを見た人にはパスワードがプレーンテキストで公開されたままになります。タスクスケジューラジョブがRobocopyを実行し、適切なドライブ文字を参照するだけでよいように、ネットワークドライブを通常は半永久的にマップすることをお勧めします。ただし、「指定されたパスが見つかりません」というエラーが常に表示されます。昇格されたコマンドプロンプトからコマンドが正常に機能する場合でも(タスクは最高の権限で実行されるように設定されています)、タスクスケジューラからこれを実行するとRobocopyログに記録されます。また、昇格したコマンドプロンプトからマップされたドライブにアクセスするために、このレジストリ調整を行ったことにも注意してください。
よく見るエラーです。
ERROR 3 (0x00000003) Getting File System Type of Destination Y:\temp\
The system cannot find the path specified.
そして、以下の方法で実現できました。
使用してみてください:
pushd \\machine\share
スケジュールされたタスクのバッチファイル内。ネットワーク共有ドライブは、ユーザー実行環境からのみ使用できます。「pushd」は、スクリプトのコンテキストで実行できるようにします。使い終わったら:
popd \\machine\share
ドライブのマッピングを解除します。
pushdを利用するとシステム的にネットワークドライブの割り当てを行う事ができますので、該当のユーザーでネットワークドライブの割り当てを行う必要なく、タスクスケジューラでrobocopyのバッチを実行することができました。
ちなみに、popdで割り当てを解除します。pushdが割り当てるドライブは未使用のドライブレターの老番から利用します。仮にZが使用されていたらYドライブになります。