web-dev-qa-db-ja.com

タスクスケジューラのジョブが割り当てられたネットワークドライブにアクセスできないのはなぜですか?

ローカルファイルをネットワーク共有にバックアップするためにRobocopyを実行するタスクスケジューラの仕事があります。ネットワーク共有にアクセスするにはドメイン資格情報を使用する必要がありますが、ローカルコンピュータはドメイン上になく、ジョブはローカル管理者として実行されます。 ネットワーク共有の一時的なマッピングとマッピング解除のこの解決方法 は機能しますが、タスクスケジューラのジョブアクションを見る人にはパスワードがプレーンテキストで公開されたままになります。タスクスケジューラのジョブでRobocopyを実行して適切なドライブ文字を参照するだけでよいように、通常はネットワークドライブを半永久的に割り当てます。しかし、「指定されたパスが見つかりません」というエラーが常に表示されます。タスクスケジューラから実行すると、Robocopyログに記録されます。ただし、コマンドは昇格されたコマンドプロンプトで正常に機能します(ジョブは最高の特権で実行されるように設定されています)。また、私が行った このレジストリの微調整 を実行して、昇格したコマンドプロンプトからマップされたドライブにアクセスするようにしました。

編集:明確にするために、ローカル管理者としてログインし、私は管理者としてWindowsエクスプローラを起動します。ネットワーク共有をドライブ文字Yにマップします。[管理者としてプロンプト]コマンドを起動して実行します。

C:\Windows\System32\Robocopy.exe C:\temp Y:\temp

正常に動作します。ユーザーがログインしているかどうかにかかわらず、まったく同じコマンドを最高の特権で実行するために、タスクスケジューラジョブを作成します。実行してエラーになります。ログに書いてもらう

ERROR 3 (0x00000003) Getting File System Type of Destination Y:\temp\
The system cannot find the path specified.

に続く

ERROR 3 (0x00000003) Creating Destination Directory Y:\temp\
The system cannot find the path specified.
26
Craig W

割り当てられたドライブはユーザーインターフェイスの概念であり、そのようなバックグラウンドタスクには使用できません。 UNCを介してターゲットにアクセスし、タスクが実行されるユーザーがターゲットにアクセスできることを確認します。

17
Jack

私の場合は、run with highest privilegesフラグをオフにしただけですが、ドライブをマップしたユーザーと同じユーザーでタスクを実行しています。

7
Peter

試してみてください。

pushd \\machine\share

スケジュールされたタスクのバッチファイル内ネットワーク共有ドライブは、ユーザーが実行する環境からしか利用できません。 "pushd"はそれをスクリプトのコンテキストで実行することを可能にします。

使い終わったら:

popd \\machine\share

ドライブの割り当てを解除します。

参照: https://blog.adrianbanks.co.uk/windows/2007/03/08/accessing-network-file-shares-from-a-command-Prompt.html

3
Anthony

[ユーザーがログオンしているかどうかにかかわらず実行する]オプションを[ユーザーがログオンしている場合にのみ実行する]に変更して、問題を解決しました。これを試してくださいそれはあなたを助けるかもしれません。

1
user731960
echo Get-Date >> c:\mount_nfs_log.txt
Net Use X: \\share\folder password /user:domain\user>> c:\mount_nfs_log.txt 2>&1

このpowershellスクリプトを作成し、SYSTEMとしてジョブをスケジュールし、リブート時に実行するように設定すると、UNCは他の問題の頭痛のせいで選択肢にならないので、スクリプトでドライブ文字を使用することができました。

1
Ryan McGrath

もう1つの選択肢は、Robocopyが完全なネットワークパスをサポートしているため、完全なネットワークパスを使用することです。すなわち、ロボコピーc:\ temp \\ server\share\temp

あるいは、サーバー自体でバックアップを実行してください。バックアッププロセス専用のドメイン管理者アカウントを作成します。ドメイン管理者だけがアクセスできるテキストファイルからパスワードをロボットコピーします。

何年も前に、ネットワーク上のすべてのシステムの重要なファイルをこのようにバックアップするいくつかの.cmdスクリプトを作成しました。私が使用した唯一の外部プログラムはCgywinのGrepコマンドとコマンドPrompt smtp mail senderでした。

私はネットワークのシステムをスキャンするスクリプトを1つ作成しました。それはすべてのシステム名のテキストファイルを作成し、発見した新しいシステムの電子メールを介して私に知らせてくれるでしょう。 (私は、システムがスキップするために解析するための設定ファイルを持っていました。)それぞれの新しいシステムはそれのために作成されたバックアップディレクトリとその中に置かれたバックアップ設定ファイルを持っていました。ユーザーはこのファイルを変更して、バックアップが必要なディレクトリを一覧表示できます。彼らはまた、彼らがオフィスにいたときには起こらないように彼らのバックアップのための時間を指定することができます。処理時間がかからず、新しいシステムがネットワークに接続されたときに警告するというセキュリティ機能が気に入っているので、このスクリプトを5分ごとにサーバーで実行しました。

別のスクリプトは、個々のバックアップ設定ファイルをすべて解析し、そのシステムでバックアップを実行するタスクをスケジュールします。これは毎日午前12時01分に実行されました。

最後に、バックアップスクリプトがスケジューラによって渡された設定ファイルを解析し、robocopyを使用してすべてのファイルをコピーします。ユーザーが設定ファイルを編集するので、私は設定ファイルを完全にチェックしてエラーがありました、そして、私はどんな問題でも電子メールを受け取るでしょう。

ユーザーは自分のバックアップファイルを読み取ることができましたが、バックアップを削除できませんでした。これは、不満を抱いている可能性のある従業員による損害からある程度の保護を提供しました。

おそらくもっとエレガントなものが.vbsやpowershellで作られていたかもしれませんが、私は本当にプログラマではありません。私のプログラミングクラスには、CobalとJCLがありました。私が去ったときに私がスクリプトをコピーしたのを覚えています、しかし誰が彼らが現在どこにいるか知っています。

1
Kevin

別のユーザーが指摘したように、[ユーザーがログオンしているかどうかにかかわらず実行する]オプションを[ユーザーがログオンしたときにのみ実行する]に設定するとうまくいくようです。その後、マッピングされたパス(例:Z :)またはサーバーパス(例:\\ ServerName\Path)を使用できます。

もちろん、このオプションを使用する場合は、そのとおりに実行し、関連するドライブへのアクセス権を持つユーザーとしてサーバーにログインしていることを確認する必要があります。私はこのような仕事をしている年配の会社にいたことを覚えています。ある日、誰かがメインのJob Serverから「サインアウト」しましたが、マシンをシャットダウンしていなかったために何らかの影響があるとは思っていませんでした...

また、最近では、Windowsは多くの自己起動システム再起動を行うのが好きです。だからあなた自身の責任でこのソリューションを使用してください。

0
Chris Matthews

次のコマンドを使用して、バッチスクリプト自体に追加し、Windowsスケジュールタスクからバッチスクリプトを実行して、Windowsスケジュールタスクを使用してローカルシステムにファイルをコピーすることができます。ネット使用Y: "\\ xxx\xxx\xxx cd/d Y:ネットユーザー/ d Y:/ Y

0
AshishS1

また、スクリプトでマッピングを作成し、パスワードに%が含まれている場合、スクリプトがタスクスケジューラから機能するには%%、commandpromptから機能するには%%と記述する必要があります。

0
Tom Arleth

「開始位置」を「c:\」に変更してみてください。セキュリティ上の問題から、システムがcmd.exeをデフォルトの\ windows\system32 \から実行できないようにしていた可能性があります。

0
user364486

私がアクセスしようとして同じ問題を抱えていた r:/xxxfilename.txt Windowsタスクスケジューラからスクリプトを呼び出すときは、Windowsマップドライブr:\ server\shareを使用します。

を使って解決しました //server/share/xxxfilename.txt
バックスラッシュがフォワードスラッシュに変換されていることに注意してください。
これで私のbashのcygwinスクリプトはWindowsのタスクスケジューラとcygwinシェルで実行されます。
注意: 「ネット利用"コマンドはシェルでマップドライブにアクセスできますが、Windowsタスクスケジューラでこのコマンドを実行するとUnavailable R:と表示されます。

0
ijimenez123