• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VBScript等でローカルエリア接続の有効・無効をしたい。)

VBScriptでローカルエリア接続の有効・無効を自動化する方法

このQ&Aのポイント
  • コントロールパネルからネットワーク接続を開けず、マイネットワークの右クリックからプロパティを開く方法でローカルエリア接続を有効・無効にするVBScriptを作成したが問題が発生している。
  • マイネットワークのプロパティが前面に出るだけで、ネットワーク接続の画面にあるfolderitemが取得できなくなっている。
  • アクティブなウィンドウのfolderitemを取得する方法や、ncpl.cplでfolderitemを取得する方法を試したが成功していない。何か他の方法はあるだろうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.3

No.2です。もう少し洗練された方法に変えました。呼び出し方は以下の通りです。 EnableLAN("ローカル エリア接続",True) EnableLAN("ローカル エリア接続",False) '*************************************************************** '* ネットワーク接続の接続/無効を制御する '* 引 数:NetworkName  処理対象のネットワーク接続名 '*     :Enable      True = 接続 / False = 無効 '* 戻り値:結果       0 = 正常終了 '*                1 = ネットワーク接続が見つからない '*                2 = 処理対象のネットワーク接続名が見つからない '*                3 = タイムアウト '*************************************************************** Function EnableLAN(ByVal NetworkName,ByVal Enable)   Const EnableVerb   = "有効にする(&A)" '接続する場合のコマンド   Const DisableVerb  = "無効にする(&B)" '切断する場合のコマンド   Const StatusPosition = 1            '状態を示す文字列の位置   Const StatusLength  = 2            '状態を示す文字列の長さ   Const EnableWord   = "接続"        '接続時の状態   Const DisableWord  = "無効"        '無効時の状態   Const MaxWaitCount  = 2000         '状態遷移の最大検査回数   Dim oShell      'シェルオブジェクト   Dim oNetwork    'ネットワーク接続   Dim oConnect    '処理対象の接続   Dim iIndex      'ネットワーク接続内のインデックス   Dim iWork      '戻り値/カウンタ   Dim sExpect     '期待する状態   Dim sStatus     '取得した状態(全文)   Set oShell = CreateObject("Shell.Application")   Set oNetwork = oShell.NameSpace("Shell:ConnectionsFolder")   If oNetwork Is Nothing Then     EnableLAN = 1     Exit Function   End If   iWork = oNetwork.Items.Count - 1   For iIndex = 0 To iWork     Set oConnect = oNetwork.Items.Item(iIndex)     If oConnect.Name = NetworkName Then Exit For   Next   If iIndex > iWork Then     EnableLAN = 2     Exit Function   End If   If Enable Then     oConnect.InvokeVerb EnableVerb     sExpect = EnableWord   Else     oConnect.InvokeVerb DisableVerb     sExpect = DisableWord   End If   For iWork = 1 To MaxWaitCount     Set oConnect = oNetwork.Items.Item(iIndex)     sStatus = oNetwork.GetDetailsOf(oConnect,2)     If Mid(sStatus,StatusPosition,StatusLength) = sExpect Then       EnableLAN = 0       Exit Function     End If     WScript.Sleep 1   Next   EnableLAN = 3 End Function ※たぶん、Windows2000でも変更なしで実行できると思います。

sc_staff
質問者

お礼

お礼遅れました。 実際に動作確認等終わり、運用でも利用の了解得ることができそうです。 ただ使えるだけでなく、参考になりました。 ありがとうございました。

その他の回答 (2)

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

大分、遅くなりましたが以下のScriptで実行できました。 環境は WindowsXP Professional SP3 です。 '************************************************** '* "ローカル エリア接続"の接続/無効を切り替える '* 引数  Enable True=接続 / False=無効 '* 戻り値 0=正常 / 1=ネットワークなし / 2=ローカル エリア接続なし / 3=タイムアウト '************************************************** Function EnableLAN(ByVal Enable)   Const ssfCONTROLS = 3   Const sColumnStatus = 2   Const sMaxCount = 2000   Const sConPaneName = "ネットワーク接続"   Const sConnectionName = "ローカル エリア接続"   Const sDisableVerb = "無効にする(&B)"   Const sEnableVerb = "有効にする(&A)"   Const sConnect = "接続"   Const sDisconnect = "無効"   Set ShellApp = CreateObject("Shell.Application")   Set oControlPanel = ShellApp.NameSpace(ssfCONTROLS)   Set oConPane = Nothing   Set oNetConnections = Nothing   For Each FolderItem In oControlPanel.Items     If FolderItem.Name = sConPaneName Then       Set oConPane = FolderItem       For Each Element In FolderItem.GetFolder.Items         If Element.Name = sConnectionName Then           Set oNetConnections = Element           Exit For         End If       Next       Exit For     End If   Next   If oConPane Is Nothing Then     EnableLAN = 1     Exit Function   End If   If oNetConnections Is Nothing Then     EnableLAN = 2     Exit Function   End If   Expected = ""   If Enable Then     oNetConnections.InvokeVerb sEnableVerb     Expected = sConnect   Else     oNetConnections.InvokeVerb sDisableVerb     Expected = sDisconnect   End If   TimeCount = 0   Do     Status = ""     For Each FolderItem In oControlPanel.Items       If FolderItem.Name = sConPaneName Then         For Each Element In FolderItem.GetFolder.Items           If Element.Name = sConnectionName Then             Status = FolderItem.GetFolder.GetDetailsOf _                 (Element, sColumnStatus)             Exit For           End If         Next         Exit For       End If     Next     If Left(Status, 2) = Expected Then       EnableLAN = 0       Exit Do     End If     If TimeCount >= sMaxCount Then       EnableLAN = 3       Exit Do     End If     WScript.Sleep 1     TimeCount = TimeCount + 1   Loop End Function

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.1

何でdevconはダメなんですか?

sc_staff
質問者

補足

実行形式を配布することができない環境であることと、devconだとデバイスIDで制御するかと思いますが、数千台のPCで、メーカーやOSも統一されているわけではないので、対応しきれないのが現状です。 ローカルエリア接続という点と、Win2kかXPの人だけ対応するので・・・ devconを使わなくてもマイネットワークの右クリックからプロパティか、ncpl.cplで開くことはできますので、コントロールパネルから判別するこの(↑)のやり方を流用できないかと考えてはいるのですが、判別させることは不可能なのでしょうか?