- ベストアンサー
VBScriptでローカルエリア接続の有効・無効を自動化する方法
- コントロールパネルからネットワーク接続を開けず、マイネットワークの右クリックからプロパティを開く方法でローカルエリア接続を有効・無効にするVBScriptを作成したが問題が発生している。
- マイネットワークのプロパティが前面に出るだけで、ネットワーク接続の画面にあるfolderitemが取得できなくなっている。
- アクティブなウィンドウのfolderitemを取得する方法や、ncpl.cplでfolderitemを取得する方法を試したが成功していない。何か他の方法はあるだろうか?
- みんなの回答 (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でも変更なしで実行できると思います。
その他の回答 (2)
- nda23
- ベストアンサー率54% (777/1415)
大分、遅くなりましたが以下の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)
何でdevconはダメなんですか?
補足
実行形式を配布することができない環境であることと、devconだとデバイスIDで制御するかと思いますが、数千台のPCで、メーカーやOSも統一されているわけではないので、対応しきれないのが現状です。 ローカルエリア接続という点と、Win2kかXPの人だけ対応するので・・・ devconを使わなくてもマイネットワークの右クリックからプロパティか、ncpl.cplで開くことはできますので、コントロールパネルから判別するこの(↑)のやり方を流用できないかと考えてはいるのですが、判別させることは不可能なのでしょうか?
お礼
お礼遅れました。 実際に動作確認等終わり、運用でも利用の了解得ることができそうです。 ただ使えるだけでなく、参考になりました。 ありがとうございました。