「ネットワークアダプターを無効に」のスレで結局あまり分からなかった
ので再度スレを立てさせていただきました。
現在もいろいろPlatform SDKを使用してやっている最中ですがいまいち
実現できません。そもそもこれを実現する際にPlatform SDKを使用
しなくてはいけないのか?すら分かりません。
「こうやればできる!」というサンプルがある方がいましたらご教授
お願いいたします。
このままレスつかづにずりずり下がっていくのも何かなーということで。
ずばりそのもののコードではないですが。
環境は Win2000sp4 VC++6.0 sp5です。(5.00.2195)
User は Administrator グループです。
前回の質問者のリクエストで WMI を指定していたものですから、
その筋に沿った使用例を示していました。
ネットワーク接続なら
NetUseDel( NULL,"Z:", USE_FORCE );
または
WNetCancelConnection2( "z:", CONNECT_UPDATE_PROFILE, FALSE); //ドライブ Z: を切断
でドライブやプリンタの接続を解除できます。
コマンドラインで net use ...してみて。
デバイス一覧からデバイスドライバの登録を削除するなら
SetupDiXXXXXX()
系ですね。「SetupDi」で検索。
#未テスト
ローカルエリア接続はサービスの停止で達成できますね。
[マイコンピュータ][管理][サービス][Workstation] -> 停止
正攻法なら、EnumServicesStatusEx()で列挙し、見つけてからOpenService() と思ったのですが、
EnumServicesStatusEx() については、ライブラリに存在せず、ヘッダファイルも見つかりません(VC Header)。
ネットで検索すると、
http://www.cygwin.com/ml/cygwin-patches/2001-q4/msg00363/w2kServiceEXupdate.patch
を見つけたのですが、怪しい。
ライブラリが見つからないのでテストできず。
仕方ないので 直接名前を調べてテストしました。
Workstation の名前は "lanmanworkstation" でした。
SC_HANDLE hSC;
SC_HANDLE hSCSvc;
SERVICE_STATUS s_svcstat;
DWORD dwResume = 0;
// 失敗でNULL
if( hSC = OpenSCManager( "Neptune", SERVICES_ACTIVE_DATABASE, SC_MANAGER_ALL_ACCESS ))
{
if( hSCSvc = OpenService( hSC, "lanmanworkstation", SERVICE_ALL_ACCESS ))
{
if(! ControlService( hSCSvc, SERVICE_CONTROL_STOP, &s_svcstat ))
{
DWORD dwErr = GetLastError();
CString cs;
cs.Format("%08X",dwErr);
MessageBox( cs, "ERROR", MB_ICONSTOP );
}
CloseServiceHandle( hSCSvc );
}
CloseServiceHandle( hSC );
}
このままではエラーコード 0000041B が返されます。
依存するサービスがあるので止められませんとのこと。
再帰的に依存するサービスを止めなければならないようだ。
EnumDependentServices()
他に影響すると困るので、とりあえず、テストを中止します。
やっぱりWorkstationのサービスを止めるしか方法はないんですね。
本当はネットワークカードが2つあって片方だけ「無効」にした
かったんです。
やっぱりできないのかなぁ・・・・・
DDK使えばできるんではないかと。
サンプルでなくて申し訳ないですが、「やっぱり」で
済まされるのはどうかと思うのでDDKでの実現方法に
ついてはご自身で調べてみてください。
IPHelperで可能の様です。
::GetIfTable(NULL, &dwSize, TRUE);
にてインターフェースを列挙した後に該当するインターフェースに対して
::SetIfEntry(&ifRow);
ifRowはPMIB_IFROW構造体でそのメンバであるdwAdminStatusに
MIB_IF_ADMIN_STATUS_UPないしはMIB_IF_ADMIN_STATUS_DOWNを設定
DDK ついでに・・・
DevCon 戸言うサンプルがありますので、それをご参照下さい。
デバイス マネージャと同等の機能を持つコマンド ライン
ユーティリティです。
実行形式のものは単体で配布されています。
http://support.microsoft.com/default.aspx?scid=kb;ja;311272
他では・・・http://www.vbcity.com/ で、この件がBBSに
上がってましたが、ユーザー登録(無料)でログインしないと
いけないのですが・・・結果、SetupDiChangeStateで行う由が
書かれていました。
ご参考までに。
以上。
一応、お知らせ・・・
C#.NET にて、ネットワークアダプタの有効化・無効化プログラム
を作成しました。
動作確認は、WinXP SP1 です。
開発環境は、VisualStudio.NET 2003 での、C#.NET です。
※ 環境によっては(ログインユーザーの権限)実行時に
エラーしますが、その辺はごかんべん・・・
ソースを公開しておきますので、お試し下さい。
http://www.accession.jp/NetAdapter.zip
※ McAfee にてウィルスチェック確認済みです。
尚、あまり詳細なエラー処理してません。
バグがありましたら、個人でご対応下さい。
※ コンパイルには、DDKは必要ありません。
以上。
追伸・・・
C#.NET 2003 のコードを、C#.NET 2002 にコンバートして
実行しましたが、一応、問題なく動作しました。
ただし、.NEt Framework 1.1 が入っていますので・・・
あと、稼動OSですが・・・
Win2000 Pro SP4
Win2000 Server SP4
の両マシンで実行しましたが、問題はありませんでした。
ただし、Server OS で実行するのは、危険がありますネ!〜
サービスとしてもバックグランドで実行しているネットワーク
リソースが必要なサーバーサービスがありますので、一瞬でも
無効化=>有効化と言う手順を実行しても、画面が真っ黒にな
り、『とんだ?!』とヒヤッとしました。
まぁ〜あくまで、実行できた・・・と言うことで。
※ ネットワークに依存するサービスがあった場合、
無効化した後、有効化してもそのサービスが正常
に動作しない場合があります。
そういうことが問題になるようでしたら、該当す
るサービスを、予め停止させ、また開始させる様
な手法が、無効化・有効化の前後に必要になりま
す。
お気をつけ下さい。
ソースコードは、英語サイトで掲載されていた内容を元に、
なんとかつぎはぎで完成させたものです。酷似するコードが
他にもあれば、多分、最低2箇所の英語圏サイトの掲示板に
掲載されたモノが元になっていると思いますが・・・
お好きなようにお使い下さい。
以上。
何人かの方が、ダウンロードされているようですが・・・
もし不都合や動作確認上、うまくいったとか、状況を投稿して
頂ければ幸いです。
以上。
すみません。みなさんありがとうございます。
現在おためしどころの騒ぎじゃないためレスが遅れてしまいました。
まだ試してはいませんが時間が出来次第やってみたいと思います。
試した結果で「解決」としたいためもうしばらくこのままとさせてください。
皆さんありがとうございます。