[手順]
- 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