none
ADからログオンスクリプトにて割り当てたネットワークドライブが上手く適用されない RRS feed

  • 質問

  • ActiveDirectoryの管理ツール「ActiveDirectory ユーザーとコンピュータ」からユーザーのプロパティ画面で、ProfileタブのLogonscriptの項目にスクリプトのファイル名を入力し設定しています。スクリプト(.bat)の内容は下記の通りです。

    ****バッチ内容*****************************

    @echo off
    NET USE H: /delete

    NET USE I: /delete

    NET USE N: /delete

    NET USE N: \\Fileserver\abc\def

    ****************************************

    上記内容によってユーザーにファイルサーバ上のフォルダをN:ドライブとしてネットワークドライブに割り当てたいと思っています。

    つい最近までH:とI:ドライブを同じようにログオンスクリプトで割り当てていたので、一度削除し新たにN:ドライブを割り当てるように

    書いています。

    しかし、上記のスクリプトを設定すると正常に適用されているPCもあれば、N:ドライブが表示されていないPC、H:ドライブやI:ドライブが

    表示されてしまっているPCなどがあります。

    さらに、ユーザーがログイン直後はH:やI:ドライブが消えていたのに、数十秒後に復活するPCもありました。

    このような現象の時に、何が原因でうまく適用されていない確率が高いのでしょうか?

    素人なのでどこを確認して解決していけばいいのかわかりません。

    詳しい方がいらっしゃったら教えてください。

    環境としては、クライアントPCはWindows7、サーバ(AD)はWindowsServer2008R2です。

    クライアント環境としては、社内LAN内での適用です。VPNなど社外アクセスでの話ではありません。

    宜しくお願い致します。

    2014年1月31日 10:11

すべての返信

  • こんにちは。

    当方環境でも,そのようにムラがある現象が発生したことがあります。

    プリンタやストレージのスタートアップランチャーが邪魔していたような例もありました。

    なお,各PCのコマンドプロンプトで

    gpupdate /FORCE

    を実行,結果を確認してみてはどうでしょう。

    強制的にグループポリシーをサーバより取得し,適用されます。

    このとき,ログオフや再起動が要求されたら,その通り再起動して下さい。

    ・ログオンスクリプトで追加させたのではなく,「手動でドライブマッピング,ログオン時再接続に設定したドライブだった」なんてこともありました。この場合手動で「切断」したような気がします。


    • 編集済み JJJ-Ran 2014年2月3日 7:36
    • 回答の候補に設定 佐伯玲 2014年2月4日 0:25
    2014年2月3日 7:34
  • チャブーンです。

    この件ですが、なぜ問題が起こったか、については、コマンドがどのように実行されたかどうかを、他の方のおっしゃる方法や「実行中のログオンスクリプトを表示する」等で実際にチェックするしか、具体的な解決策は出てこないと思いますが、問題を回避する方法として、ログオンスクリプトではなくて、グループポリシーの「基本設定」のドライブマップ項目を使う手があるかもしれません。方法については、したの資料をご覧になってみてください。Windows 7がクライアントであれば、ドメインコントローラ側で設定するだけで、そのまま使えます。

    http://technet.microsoft.com/ja-jp/library/cc731729.aspx

    • 回答の候補に設定 佐伯玲 2014年2月4日 0:25
    2014年2月3日 19:06
    モデレータ
  • JJJ-Ranさん、 チャブーンさん

    ご回答ありがとうございます。

    「gpupdate /FORCE」を実行しても駄目でした。

    自分でも調べて自動再接続をオフにする「NET USE /PERSISTENT:NO」があることを知り

    バッチ内容を下記のように変えてみましたが、なぜか自分のPCは2日後にI:ドライブが勝手に復活しました。

    ****バッチ内容*****************************

    @echo off

    NET USE /PERSISTENT:NO

    NET USE H: /delete

    NET USE I: /delete

    NET USE N: /delete

    NET USE N: \\Fileserver\abc\def

    NET USE /PERSISTENT:YES

    ****************************************

    ※最後にN:ドライブは自動接続にしたいので/PERSISTENTをYESに再設定しましたがこれがいけないのかな。。。

    グループポリシーによる方法については、会社の事情により利用するのが難しいため

    スクリプトにて対応したいところです。

    なんとなくですが、ドライブマッピングのキャッシュのようなものが残ってしまっているような感じがします。

    それをクリアする方法などがあれば試してみたいです。

    お二人ともありがとうございます。

    引き続きなにかあればみなさん教えてください。

    2014年2月4日 1:45
  • 私も、同じ現象に陥った事があります。

    まず、UAC + ログオンスクリプトの実行とExplorer.exeのロードのタイミングに相関して発生している可能性があると思います。
    http://technet.microsoft.com/en-us/library/ee844140(v=ws.10).aspx

    ⇒ この EnableLinkedConnections が有効という情報は多くみられますが、私の環境では駄目でした。

    また、セキュリティソフトが影響しているという情報もあります。
    http://social.technet.microsoft.com/Forums/windows/en-US/d884e4b9-fce3-4255-8b74-cf3cfd001ffb/missing-network-drives?forum=w7itpronetworking


    結局、私の環境では、どうしてもExplorerロードのタイミングでExplorerの表示だけおかしく、
    (Net Useで確認すると正常、Explorer.exeを再起動すると正常、など)
    パスを動的に生成していたため、スクリプト内でマッピングのタイミングを遅延させる事で対応しました。

    2014年2月4日 1:57
  • oooohです。

    詳しくないとのことで基本的なことから・・・

    今一度、ログオンスクリプト設定をご確認ください。

    ①ADサーバにて登録しているログオンスクリプトのパスがユーザーから見てのものかどうか。

     ○ \\%logonserver%\netlogon\hogehoge.cmd

     × C:\windows\sysvol\sysvol\%domainname%\scripts\hogehoge.cmd

    ②ログオンスクリプトの配置場所

     ・通常は%logonserver%\netlogon 内に設置します。

     ・その他の場所を参照させる場合はクライアントにアクセス権があるかどうかの確認をしてください。

    ③バッチの動作確認

     まず、クライアントPCに運用ユーザーでログオンし、ログオンスクリプトを直接実行します。

     この時点で正常に動作していないならばそもそも記述がおかしいということになります。

    ④oooohが記述するなら・・・

    ---------------------------------------------------------------

     @echo off

    :ネットワークドライブの割り当て

     net use H: /delete /yes

     net use I: /delete /yes

     net use N: /delete /yes

     net use N: \\fileserver\abc\def /persistent:no

    ---------------------------------------------------------------

    こうします。

    なんとなく切断するコマンドに /yes がないとメッセージで止まって切断しない気がしますが動確してますかね?

    また、そうじゃなくてスクリプトがたまに流れないんだよ。ということであれば、

    GPOにて「ログオンスクリプトを同期的に実行する」等を追加して様子を見てください。

    2014年2月4日 5:32
  • LazyDoggさん

    ご回答ありがとうございます。

    すごく参考になります。EnableLinkedConnectionsというレジストリ追加の方法があるなんて。

    是非試してみます。上手くいけばレジストリの追加を全社へ行ってもいいかどうか確認してみます。

    ※ダメといわれそうですが。。。。。

    Explorerロードのタイミング、、、たしかに起因しているのかもしれませんね。勉強になります。

    oooohさん

    ご回答ありがとうございます。スクリプト内に記述しているサーバパスやスクリプト実行自体は大丈夫です。

    実行されているんですが、うまく適用されていないんです。(正常に適用されているのもある)

    でもたしかに/yesはつけておいた方がいいですね!

    2日間問題なくN:ドライブしか表示されていなかった自分のPCが、本日なぜかI:ドライブ復活しました。。。。

    意味不明です。

    ネットに、レジストリの「HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Map Network Drive MRU\」にドライブマッピングの履歴が残っていると書かれていたので、自分のPCで見てみたらありました。。。。

    しかし、他のPCでレジストリのキーが無いのにI:ドライブが復活するPCがあり、そのPCは自動再接続が有効になっていたので

    無効に切り替えて様子見しています。

    自分のPCもレジストリを削除し様子見しています。

    ログオンスクリプトも下記のVBSへ変更しました。※一度DELETEしてもキャッシュのようなものが残り、マップを拾ってくる場合があるので2回繰り替えすようにした。

    ****スクリプト内容*****************************

    Option Explicit

    Dim rtn

    rtn = Set_NWD()

    If rtn = "success" Then
    ElseIf rtn = "error" Then
     rtn = Empty
     rtn = Set_NWD()
     If rtn = "success" Then
     ElseIf rtn = "error" Then
      Msgbox "正常に割り当てが出来ませんでした!", vbCritical
     Else
      Msgbox "スクリプトが正常に動作しませんでした!", vbCritical
     End If
    Else
     Msgbox "スクリプトが正常に動作しませんでした!", vbCritical
    End If

    function Set_NWD()

     Dim New_NWD, Old_NWD
     Dim wsh, oClass, oClassSet
     Dim oLocator, oService

     New_NWD = 0
     Old_NWD = 0

     Set wsh = CreateObject("WScript.Shell")
     Set oLocator = WScript.CreateObject("WbemScripting.SWbemLocator")
     Set oService = oLocator.ConnectServer
     Set oClassSet = oService.ExecQuery("Select * From Win32_MappedLogicalDisk")

     wsh.Run "cmd /c (NET USE /PERSISTENT:NO)",1,true
     wsh.Run "cmd /c (NET USE H: /delete /yes)",1,true
     wsh.Run "cmd /c (NET USE I: /delete /yes)",1,true
     wsh.Run "cmd /c (NET USE N: /delete /yes)",1,true
     wscript.sleep 1000
     wsh.Run "cmd /c (NET USE N:\\fileserver\abc\def )",0,true
     wscript.sleep 3000

     For Each oClass In oClassSet
      Select Case oClass.Name
       Case "H:"
        Old_NWD = Old_NWD + 1
       Case "I:"
        Old_NWD = Old_NWD + 1
       Case "N:"
        New_NWD = New_NWD + 1
       Case Else

      End Select
     Next

     If New_NWD = 1 and Old_NWD = 0 Then
      Set_NWD = "success"
     Else
      Set_NWD = "error"
     End If

     Set wsh = Nothing
     Set oClassSet = Nothing
     Set oClass = Nothing
     Set oService = Nothing
     Set oLocator = Nothing

    end function

    wscript.quit

    *******************************************

    みなさん、助かります。

    みなさんのご意見を参考に色々試してみます。

    その他ありましたらまたご意見ください。宜しくお願いします。

    2014年2月4日 9:42
  • oooohです。

    net use文は既定でpersistent:yesなので、表示が残ってしまう可能性があります。

    なのでwsh.Run "cmd /c (NET USE N:\\fileserver\abc\def )",0,true

    wsh.Run "cmd /c (NET USE N:\\fileserver\abc\def /persistent:no )",0,true

    とするといいと思いますよ。

    • 回答の候補に設定 佐伯玲 2014年2月14日 5:20
    2014年2月7日 11:02