2009/02/08 03:58


잠깐 군복무시절 이야기를 할께요...^^
때는 2004년부터 2006년 사이입니다. 저는 공군의 한 비행교육대대의 CQ(항공운항병)로 근무하고 있었습니다.
대대의 주 임무가 비행이다보니 대외비부터 2급비밀까지 비밀 투성이였습니다.
컴퓨터에도 위험한 문서들이 많이 있었죠. 병사들도 비밀을 만질 수 밖에 없는 환경이다 보니...
가끔식 보안검열을 하면 지적을 받곤 했었습니다. 사실 대박 영창감인데... ㅋ 워낙 군대는 가라가 많아서리..ㅋㅋ
하지만 컴퓨터에서 비밀문서 편집을 해야만 하기때문에 특별한 보안지침이 있었습니다.
그것은 바로 자신의 컴퓨터에서 비밀문서를 취급할때는 인트라넷선을 꼭 뽑아놓고 사용하라는 지침이었습니다.
대대에서는 LAN선을 A와 B로 나누어 선택하여 쓸 수 있는 스위칭 장치를 구입하여 랜선을 껐다 켰다 하는 장치로 사용하였고,
그때 상당히 많은양을 구입한것으로 생각됩니다. 전국 비행대대가 거의 샀다고 들렸으니까요...

제 전공이 전공인지라, '그거 그냥 네트워크 사용안함으로 놓고 쓰면 될텐데...' 하는 생각을 많이 했었습니다.
하지만 입을 다물었습니다. 50여명이나 되는 장교들에게 그것을 가르쳐주기란... 미X짓이나 다름이 없었으니까요...ㅡㅡ;
대한민국 부사관, 장교들의 상당수는 병사가 할일을 절대 배워서 스스로 하려고 하지 않습니다. 시키죠... 편하게...ㅡㅡ;

하여튼 그때는 가르쳐주기도 힘들었고, 그 스위칭장치가 비록 얼마 하지 않았지만 왠지 혈세낭비같아 보여서 좀 비효율적이라는 생각이 많이 들었습니다. 그래서 생각한것이 소프트웨어를 하나 만들어서 배포하면 좋겠다는 생각을 해보았습니다.
물론 그시절엔 그런걸 구현할 수 있는 실력도 안되었으면서 그냥 막연한 생각만 했었습니다. 굉장히 간단할것 같은데 말이죠...

그러고 전역을 하고, 1년이 지나고 2년이 지난 2008년 10월쯤 문득 생각이 나서, 관련 자료를 찾아보았습니다.
그때 이 페이지를 보았습니다.

NIC 이름으로 활성/비활성 시키는 코드 : http://blog.naver.com/PostView.nhn?blogId=noirxeno&logNo=60053988997

그리고 더 찾아다니다가 또하나 발견했습니다.

Disable/Enable Network : http://www.codeguru.com/forum/showthread.php?t=419909

소스를 보니 역시 간단했습니다. 하지만 그시절엔 이 소스를 봤어도 못만들었을테지요... 하여튼 뿌듯했습니다.
한나절 끄적대서 프로그램을 만들고, 부대에 있는 X하사 형님에게 보내주고, 컴에 저장시켜 놓았다가...
요즘 블로그를 작성하면서 잘 정리하여 보관하고, 또 사람들과 공유하기 위하여 이 글을 쓰고 있습니다.

서론이 너무 길었습니다. ㅎㅎㅎ 본론으로 들어가죠.
먼저 소스코드입니다. 이 소스는 블로그에 올리려고 제가 쉽게 다시 뽑아낸 소스입니다.
소스 Copy & Paste 하셔서 BreakPoint찍어가면서 몇번만 실행해보시면 금방 이해하실 수 있을겁니다.
설명은 따로 안하겠습니다....

이 소스로 제작된 프로그램은 http://funnism.com/15 에서 다운받으실 수 있습니다.

#include
#include
#include
#include

using namespace std;

BOOL IsConnection();
int Connect();

int main()
{
    int hr = 0;

    if(IsConnection()){
        // 연결이 되어있는 상태입니다.
        cout << "현재 네트워크 카드의 드라이브는 사용중입니다." << endl;
        cout << "연결 해제합니다.";
    }else{
        // 연결이 되어있지 않으니 연결합니다.
        cout << "현재 네트워크 카드의 드라이브는 사용중지된 상태입니다." << endl;
        cout << "연결 합니다. : ";
    }
    hr = Connect();

    if(hr==0){
        cout << "네트워크 카드의 연결이 해제되었습니다." << endl;
    }else if(hr == 1){
        cout << "네트워크 카드가 연결되었습니다." << endl;
    }
    return 0;
}

BOOL IsConnection(){
    int status = FALSE; //1:connect, 0:disconnect
    HRESULT result = 0;

    CoInitialize(0);

    INetConnectionManager *pMan = 0;
    HRESULT hres = CoCreateInstance(CLSID_ConnectionManager,
                                                        0,
                                                        CLSCTX_ALL,
                                                        __uuidof(INetConnectionManager),
                                                        (void**)&pMan);

    if (SUCCEEDED(hres))
    {
        IEnumNetConnection *pEnum = 0;
        hres = pMan->EnumConnections(NCME_DEFAULT, &pEnum);
        if (SUCCEEDED(hres))
        {
            INetConnection *pCon = 0;
            ULONG count;
            while (pEnum->Next(1, &pCon, &count) == S_OK )
            {
                NETCON_PROPERTIES *pProps = 0;
                hres = pCon->GetProperties(&pProps);
                if (SUCCEEDED(hres))
                {
                    if (pProps->Status == NCS_DISCONNECTED){
                        status = FALSE;
                    }
                    else if (pProps->Status == NCS_CONNECTED){
                        status = TRUE;
                    }

                    if (pProps)
                    {
                        CoTaskMemFree(pProps->pszwName);
                        CoTaskMemFree(pProps->pszwDeviceName);
                        CoTaskMemFree(pProps);
                    }
                }
                pCon->Release();
            }
            pEnum->Release();
        }
        pMan->Release();
    }

    CoUninitialize();
    return status;
}

int Connect(){
    int status = 0; //1:connect, 0:disconnect
    HRESULT result = 0;

    CoInitialize(0);

    INetConnectionManager *pMan = 0;
    HRESULT hres = CoCreateInstance(CLSID_ConnectionManager,
                                                        0,
                                                        CLSCTX_ALL,
                                                        __uuidof(INetConnectionManager),
                                                        (void**)&pMan);

    if (SUCCEEDED(hres))
    {
        IEnumNetConnection *pEnum = 0;
        hres = pMan->EnumConnections(NCME_DEFAULT, &pEnum);
        if (SUCCEEDED(hres))
        {
            INetConnection *pCon = 0;
            ULONG count;
            while (pEnum->Next(1, &pCon, &count) == S_OK)
            {
                NETCON_PROPERTIES *pProps = 0;
                hres = pCon->GetProperties(&pProps);
                if (SUCCEEDED(hres))
                {
                    if (pProps->Status == NCS_DISCONNECTED){
                        result = pCon->Connect();
                        status = 1;
                    }
                    else if (pProps->Status == NCS_CONNECTED){
                        result = pCon->Disconnect();
                        status = 0;
                    }

                    if (pProps)
                    {
                        CoTaskMemFree(pProps->pszwName);
                        CoTaskMemFree(pProps->pszwDeviceName);
                        CoTaskMemFree(pProps);
                    }
                }
                pCon->Release();
            }
            pEnum->Release();
        }
        pMan->Release();
    }

    CoUninitialize();
    return status;
}
저작자 표시 비영리 변경 금지
Posted by 태발이