[手順]
- INetSharingManagerのタイプを取得
- INetSharingManagerのインスタンスを取得
- INetSharingMgr.EnumEveryConnectionでネットワークデバイスのEnumerableを取得
- get_NetConnectionProps()で各デバイスの素性を調べ、パブリック(WAN向け)とプライベート(LAN向け)を探し出す
- INetSharingConfiguration.EnableSharingでパブリックとプライベートデバイスにICSを設定
[メモ]
- 参照設定としてCOMのNetConLib 1.0を、コードにusing NETCONLib;を入れて、少しでも苦労を減らす
- INetConnectionPropsインスタンスからはGUID以外にもNameやDeviceNameが取れるが、GUIDはWMIのSettingIDと対応するので、WMIとの連携動作に使える
[コード]
ここでは予めパブリックとプライベートネットワーク接続のGUIDがわかっているとします。(別途WMIでネットワークデバイスのリストを作成、ユーザーに選んでもらいGUIDを得ている)
using NETCONLib; // Create list of connections Type NetSahringMgrType = Type.GetTypeFromProgID("HNetCfg.HNetShare.1"); INetSharingManager NetSharingMgr = Activator.CreateInstance(NetSahringMgrType) as INetSharingManager; INetSharingEveryConnectionCollection everyConn = NetSharingMgr.EnumEveryConnection as INetSharingEveryConnectionCollection; Dictionary<Guid, INetSharingConfiguration> ConnPropList = new Dictionary<Guid, INetSharingConfiguration>(); foreach (INetConnection aConn in everyConn) { INetConnectionProps aConnProp = NetSharingMgr.get_NetConnectionProps(aConn) as INetConnectionProps; INetSharingConfiguration aConnConfig = NetSharingMgr.get_INetSharingConfigurationForINetConnection(aConn) as INetSharingConfiguration; Guid GUIDofConn = new Guid(aConnProp.Guid); ConnPropList.Add(GUIDofConn, aConnConfig); //System.Diagnostics.Debug.WriteLine(string.Format("Name : {0}", aConnProp.Name)); //System.Diagnostics.Debug.WriteLine(string.Format("DeviceName: {0}", aConnProp.DeviceName)); //System.Diagnostics.Debug.WriteLine(string.Format("SettingID : {0}", aConnProp.Guid)); } // Enable ICS on specified NIC ConnPropList[PublicSettingID].EnableSharing(tagSHARINGCONNECTIONTYPE.ICSSHARINGTYPE_PUBLIC); ConnPropList[PrivateSettingID].EnableSharing(tagSHARINGCONNECTIONTYPE.ICSSHARINGTYPE_PRIVATE); // Release COM objects foreach (INetSharingConfiguration aSharingConn in ConnPropList.Values) { System.Runtime.InteropServices.Marshal.ReleaseComObject(aSharingConn); } System.Runtime.InteropServices.Marshal.ReleaseComObject(everyConn); System.Runtime.InteropServices.Marshal.ReleaseComObject(NetSharingMgr);[参考]
Comments