BLOG
ブログ

2018.11.30

Windowsログオフ中のネットワークドライブ状態に注意

こんにちは、トランソニックソフトウェアのシステムエンジニア、古澤です。

今後開発作業にて、技術面で気付いたことを細々と発信していきます。

【内容】

 Windowsログオフ中のネットワークドライブ状態に注意

【前置き】

お客様の依頼で、以下の様な要望がありました。

「社内LAN上の共有フォルダに保存してある特定のファイルを、クライアントPCからFTPアップロードするバッチファイルを作ってほしい」

WindowsのバッチファイルとFTPツール「WinSCP」を利用して作成し納品しましたが、お客様からの動作不良のご報告を頂きました。

「ユーザーが手作業でバッチファイルを起動させるとうまくいくが、タスクスケジューラで自動起動させると処理が止まる」

「タスクスケジューラでの運用なんて聞いてないよ…」なんて愚痴をこぼしながら、タスクスケジューラの設定不備を疑って原因調査しました。
しかしどうにも改善しません。

 

【問題点】

結論から言いますと、タスクスケジューラには設定不備は無く、バッチファイル側の処理に問題がありました。
いろいろ調べると、以下の事が分かりました。

  1. ・お客様はWindowsがログオフ状態時にタスク起動させる運用方法を意図している
  2. ・Windows共有フォルダ機能は、ログオフ中は機能しない

 

これでは共有フォルダにアクセスできないじゃないか!!と疑問に思いましたが、案の定でした。
下記の例では、WinSCPのPUTコマンドを使って、pdfファイルのFTPアップロードを試みています。
前述の問題の為、どちらの例でもログオフ中はうまく動きません。

 

■ダメな例1

WinSCP> PUT "Z:\pdf\社内資料.pdf" "/共有/pdf/社内資料.pdf"

 

Zドライブは、ネットワーク共有ドライブです。
Windowsのネットワークドライブのマウント機能はログインユーザーに紐づけられています。(これはWindows自体の仕様であり、変更不可とのこと)
その為ログオフ中はZドライブが存在しません。
存在しないドライブのパスを指定しているので、PUTコマンドはエラーになります。

 

■ダメな例2

WinSCP> PUT "\\192.168.xxx.xxx\共有フォルダ\pdf\社内資料.pdf" "/共有/pdf/社内資料.pdf"

 

ネットワーク共有ドライブをIPアドレスで直接指定しています。
どうやらこの書き方でも、ログオフ中にネットワークドライブにはアクセスできないらしいです。

 

【解決策】

バッチファイル内で、自前でネットワーク共有ドライブをマウントして使用します。
NET USE Z: “\\192.16 ~ の部分がその処理です。

 

■ダメではない例

> NET USE Z: "\\192.168.xxx.xxx\共有フォルダ\"
> WinSCP ftp://user:password@host
>
WinSCP> PUT "Z:\pdf\社内資料.pdf" "/共有/pdf/社内資料.pdf"
WinSCP> bye
>
> NET USE Z: /delete

 

ついでに処理が終わったらマウントしたドライブを解除します。
NET USE Z: /delete の部分がその処理です。

※補足:

バッチファイルの中に直接WinSCPのコマンドを記入している様に見せていますが、実際はバッチファイルとWinSCP用のスクリプトを別ファイルに分ける必要があります。

 

最近はC#でコーディングする事が多いのですが、C#みたいな高級言語のつもりでバッチファイルを書き始めてしまうと、Windowsバッチファイルの制約の多さにびっくりしますね。
バッチ処理向けのスクリプトで、ある程度高機能を求めるひとには、VBScriptかPowerShellあたりをオススメします。(筆者はどちらも使いこなせません)