プロが教えるわが家の防犯対策術!

コントロールパネルからネットワーク接続を開かせ、右クリックメニューにある「有効にする」or「無効にする」を選択するという自動化したものがあったのですが、
仕事で利用しているPCなのでコントロールパネルが開かず、マイネットワークの右クリックからプロパティか、ncpa.cplで開くしか手段がなく、利用できませんでした。

devconなどの他ツールを使わずにローカルエリア接続を有効にしたいのですが、何か方法はありませんでしょうか?

ちなみに、弄った後のものになりますが、下記方法だとマイネットワークのプロパティが前面に出るだけで、ネットワーク接続の画面にあるfolderitemが取得できなくなっています。

アクティブなウィンドウのfolderitemを取得するとか、右クリックのプロパティをDo itじゃなく、画面開いたときと同じような処理(スクリプト上で自動認識?)できるのであれば問題もなさそうなのですが・・・

それかncpl.cplでfolderitemを取得して・・・という方法もあるのかもしれません(調べましたが見つかりませんでしたorz)

Const ssfDESKTOP = 0
Const sConPaneName = "マイ ネットワーク"
Const sConnectionName = "ローカル エリア接続"
Const sConAAA = "プロパティ(&R)"
Const sDisableVerb = "無効にする(&B)"
Const sEnableVerb = "有効にする(&A)"

set shellApp = createobject("shell.application")
set oControlPanel = shellApp.Namespace(ssfDESKTOP)
set oNetConnections = nothing
set oNetC2onnections = nothing

for each folderitem in oControlPanel.items
if lcase(folderitem.name) = lcase(sConPaneName) then
set oNetConnections = folderitem': exit for
end if

'if folderitem.name = sConPaneName then
'set oNetC2onnections = folderitem.getfolder: exit for
'end if
next


for each verb in oNetConnections.verbs
if verb.name = sConAAA then
verb.Doit
WScript.Sleep 2000
end if
next


if oNetConnections is nothing then
wscript.quit
end if

Set WshShell = CreateObject("Wscript.Shell")
WshShell.AppActivate("ネットワーク接続")
set oNetC2onnections = folderitem.getfolder


set oLanConnection = nothing
for each folderitem in oNetC2onnections.items
msgbox folderitem.name
if lcase(folderitem.name) = lcase(sConnectionName) then
set oLanConnection = folderitem: exit for
WScript.Echo "aaaaaaa"
end if
next

if oLanConnection is nothing then
wscript.quit
end if

for each verb in oLanConnection.verbs
if verb.name = sDisableVerb then
verb.Doit
WScript.Sleep 2000
end if
next

お分かりになられる方いらっしゃいましたら、ご教授願います。

A 回答 (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でも変更なしで実行できると思います。
    • good
    • 1
この回答へのお礼

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

お礼日時:2008/06/30 09:57

大分、遅くなりましたが以下の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
    • good
    • 0

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

この回答への補足

実行形式を配布することができない環境であることと、devconだとデバイスIDで制御するかと思いますが、数千台のPCで、メーカーやOSも統一されているわけではないので、対応しきれないのが現状です。
ローカルエリア接続という点と、Win2kかXPの人だけ対応するので・・・

devconを使わなくてもマイネットワークの右クリックからプロパティか、ncpl.cplで開くことはできますので、コントロールパネルから判別するこの(↑)のやり方を流用できないかと考えてはいるのですが、判別させることは不可能なのでしょうか?

補足日時:2008/06/04 08:36
    • good
    • 0

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