プロが教える店舗&オフィスのセキュリティ対策術

いつもありがとうございます。
現在、サーバ上の2つの共有フォルダへネットワークドライブを作成するVBSを作成しております。
動作と致しましては、VBS実行時に共有フォルダへアクセスするユーザ名とパスワードを入力するフォームを表示して、認証をパスするとネットワークドライブを作成します。
※アカウント・パスワードは共通です。

ネット上からアドバイスをいただき、参考にして下記ソース(拙いコードで申し訳ありません)にて作成したのですが、接続に失敗した際のメッセージがうまくできません。
実現したいことは失敗した際の「ユーザ名、、またはパスワードが間違っています」を表示するようにしておりますが、ネットワークドライブ接続回分表示されます。(今回の場合は2回)

複数のネットワークに失敗した場合でも1回のみの表示にして処理を終了させたいのですが
アドバイス頂けないでしょうか。(最終行付近)

-----------------------------------------------------------------------------
Set objNetwork = WScript.CreateObject("WScript.Network")
Set objWShell = CreateObject("wscript.shell")

' ホスト名
strComputerName = UCase(Left(objNetWork.ComputerName, 6))

' 本スクリプト名
strScriptPath = WScript.ScriptName

' コンピュータ名から対象の学校を検索
Select Case strComputerName

Case "CN3002"
SchoolName = "会社A"
ServerIP = "\\192.168.1.30"
Drive_Letter1 = "S:"
Drive_Letter2 = "T:"
Drive_Letter3 = "U:"
Drive_Letter4 = "V:"
Drive_Letter5 = "W:"
Drive_Letter6 = "X:"
UNC_Path1 = ServerIP & "\共有A"
UNC_Path2 = ServerIP & "\共有B"
UNC_Path = Array(UNC_Path1, UNC_Path2)
Drive_Letter = Array(Drive_Letter1, Drive_Letter2)

Case Else
Wscript.echo "対象のサーバが確認できません。" & chr(13) & "ホスト名を確認して再度実行してください。"
WScript.Quit 10

End Select

Set colDrives = objNetwork.EnumNetworkDrives
Drive_Count = 0
ServerFlag = 0
Raku_ServerFlag = 0
For i = 0 to colDrives.Count - 1 Step 2

If Left(colDrives.Item(i + 1),15) = ServerIP Then
ServerFlag = 1
End If

If SchoolName = "会社B" AND Left(colDrives.Item(i + 1),15) = ServerIP2 Then
Raku_ServerFlag = 1
End If
Next
If ServerFlag <> 1 Then
call InputUser(strUser,strPassword)
Raku_ServerFlag = 1
End If
If SchoolName = "会社B" AND Raku_ServerFlag <> 1 Then
call InputUser(strUser,strPassword)
End If
' 認証のみで接続されているUNCパスへの対応
For i = 0 to colDrives.Count - 1 Step 2
Next
colD_Count = i - 1

For j = 0 to UBound(Drive_Letter)
Drive_Count = 0
For i = 0 to colD_Count Step 2
If Drive_Letter(j) = colDrives.Item(i) Then
Drive_Count = Drive_Count +1
End If
Next
' 洛陽2台目サーバ対策
If Drive_Count <> 1 AND SchoolName = "会社B" AND Drive_Letter(j) = Drive_Letter4 Then
On Error Resume Next
objNetwork.MapNetworkDrive Drive_Letter(j), UNC_Path(j), False, strUser, strPassword

Call ErrorCheck(Err.Number)

ElseIf Drive_Count <> 1 Then

If ServerFlag <> 1 Then
On Error Resume Next
objNetwork.MapNetworkDrive Drive_Letter(j), UNC_Path(j), False, strUser, strPassword

Call ErrorCheck(Err.Number)
Else
On Error Resume Next
objNetwork.MapNetworkDrive Drive_Letter(j), UNC_Path(j), False

Call ErrorCheck(Err.Number)
End If
End If
Next

' ユーザ名とパスワードを入力
Sub InputUser(strUser,strPassword)
On Error Resume Next

Set objExplorer = WScript.CreateObject _
("InternetExplorer.Application", "IE_")

objExplorer.Navigate "file:///C:\WINDOWS\System32\Password.htm"
objExplorer.Title = "学習系サーバ接続"
objExplorer.ToolBar = 0
objExplorer.StatusBar = 0
objExplorer.Width = 400
objExplorer.Height = 200
objExplorer.Left = 300
objExplorer.Top = 200
objExplorer.Visible = 1

Do While (objExplorer.Document.Body.All.OKClicked.Value = "")
Wscript.Sleep 250
Loop

strUser = objExplorer.Document.Body.All.UserName.Value
strPassword = objExplorer.Document.Body.All.UserPassword.Value
strButton = objExplorer.Document.Body.All.OKClicked.Value
objExplorer.Quit
Wscript.Sleep 250

If strButton = "Cancelled" Then
Wscript.Quit
End If
On Error Goto 0

End Sub

Sub ErrorCheck(Err_Number)
If Err_Number <> -2147024891 Then
Select Case Err_Number
Case -2147023570
Wscript.echo "ユーザー名かパスワードが間違っています。"
Exit Sub
Case 0
Exit sub
Case Else
Wscript.echo "ネットワーク状態を確認してください。"
End Select
End If
End Sub
-----------------------------------------------------------------------------

以上、あまり良い質問ではありませんが、どうぞよろしくお願い致します。

A 回答 (2件)

二回目以降のエラーの場合には処理を中断して抜ける・・という事でしょうか?


なら、下記が参考になるかも?
適当なファイル名でお試しを

dim failcount '失敗数

for i = 1 to 6
wscript.echo i & "_" & failcount
if failcount > 1 then
wscript.echo failcount & "over "
wscript.quit
end if
call chk(i)
next

sub chk(i)
if i mod 2 = 0 then
failcount = failcount + 1
end if
end sub

個人的にはネットワークドライブが中途半端で設定されるのは嫌なので
一旦、総なめしてエラーが無かったらネットワークドライブの設定処理に入る
↑その分、倍近く処理時間が掛かってしまいます

先の回答者さんのようにエラー時には逐一Wscript.echoで出さずに
ため込んでいて最後に成功の可否を出すようにすると思います。

この回答への補足

ありがとうございます。
nicotinism様のおっしゃる通り、「2回目以降(ひとつの処理が失敗=2回目以降も失敗)はメッセージを表示せず、処理を終了する」といった動作を希望しています。
一度、教えて頂いたソースを参考にさせて頂きます!

補足日時:2012/06/04 15:03
    • good
    • 0

エラーバッファを準備し、そこにエラーメッセージを追記していって、最後にエラーバッファの内容を出力するとか。

    • good
    • 0
この回答へのお礼

ご回答いただき、ありがとうございました。
処理の構成を再度見直してみます!知識が乏しくすぐには作成できないと思いますが、ありがとうござす

お礼日時:2012/06/05 11:01

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!