检测网络中的服务器状态,如果那台服务器的硬盘坏了或者被拔出能马上知道并告知一个设定的主机!

解决方案 »

  1.   

    每隔一定的时间向磁盘里写入 log。可以写,表示有,不能写表示无。
      

  2.   

    没想到什么好主意,有个馊主意:记录开始有几个盘,一个个盘符检测,根据变化去判断。好像这样可以的.先调用API检测一共有多少个盘,每个盘总容量为多少,接下来再判断现在有几个盘,如果少了再根据容量判断是哪个盘少了.
      

  3.   

    LINUX和WINDOWS系统都有,是磁盘阵列
      

  4.   

    #define _WIN32_DCOM #include <stdio.h>
    #include <objbase.h>
    #include <comdef.h>
    #include <wbemidl.h># pragma comment(lib, "wbemuuid.lib")void PrintBiosUuid();void main(void)
    {
    PrintBiosUuid();
    return;
    };void PrintBiosUuid()
    {
    BOOL bRet = FALSE;
    HRESULT hr = S_OK;
    BSTR bstrNamespace = L"root\\cimv2";
    BSTR bstrQuery = L"SELECT * FROM Win32_DiskDrive";
    VARIANT vVal;
    ULONG uEnumRet = 0;
    IWbemLocator *pWbemLocator= NULL;
    IWbemServices *pServices= NULL;
    IEnumWbemClassObject *pEnum= NULL;
    IWbemClassObject *pObj= NULL;hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
    hr = CoInitializeSecurity(NULL, -1, NULL, NULL,
    RPC_C_AUTHN_LEVEL_CONNECT,
    RPC_C_IMP_LEVEL_IMPERSONATE,
    NULL, EOAC_NONE, 0);
    if (FAILED(hr))
    {
    CoUninitialize();
    #ifdef _DEBUG
    printf("Failed to initialize security. "); printf("Error code = [0x%8X]\n", hr);
    #endif
    goto EXIT;
    }hr = CoCreateInstance(CLSID_WbemLocator, NULL, 
    CLSCTX_INPROC_SERVER, IID_IWbemLocator, 
    (void**) &pWbemLocator);
    if( FAILED(hr) ) 
    {
    #ifdef _DEBUG 
    printf("CoCreateInstance failed. "); printf("Error code = [0x%8X]\n", hr);
    #endif
    goto EXIT;
    }hr = pWbemLocator->ConnectServer(bstrNamespace, NULL, NULL, NULL,
    0, NULL, NULL, &pServices);
    if(FAILED(hr)) 
    {
    #ifdef _DEBUG
    printf("pWbemLocator->ConnectServer failed. "); printf("Error code = [0x%8X]\n", hr);
    #endif
    goto EXIT;
    }pWbemLocator->Release();
    pWbemLocator = NULL;#ifdef _DEBUG
    printf("Successfully connected to namespace [%S]\n", bstrNamespace);
    #endifhr = pServices->ExecQuery(L"WQL", bstrQuery, 0, NULL, &pEnum);if(FAILED(hr))
    {
    #ifdef _DEBUG
    printf("IWbemServices::ExecQuery failed. "); printf("Error code = [0x%X]\n", hr);
    #endif
    goto EXIT;
    }hr = pEnum->Reset();
    hr = pEnum->Next(WBEM_INFINITE, 1, &pObj, &uEnumRet);
    LPWSTR wsz[2] = {L"InterfaceType",L"PNPDeviceID"};
    while(S_OK == hr)
    {
    for (int i=0; i<2; i++)
    {
    //ZeroMemory(&vVal,sizeof(VARIANT));
    hr = pObj->Get(wsz[i], 0, &vVal, NULL, NULL);
    if (vVal.bstrVal && hr == S_OK)
    {
    wprintf(L"%s  is: [%s]\n",wsz[i], vVal.bstrVal);
    }
    }
    printf("\n");
    hr = pEnum->Next(WBEM_INFINITE, 1, &pObj, &uEnumRet);
    }if(FAILED(hr))
    {
    #ifdef _DEBUG
    printf("IEnumWbemClassObject::Next failed. "); printf("Error code = [0x%8X]\n", hr);
    #endif
    goto EXIT;
    }EXIT:
    if(pObj)
    pObj->Release();if(pEnum)
    pEnum->Release();if(pServices)
    pServices->Release();if(pWbemLocator)
    pWbemLocator->Release();CoUninitialize();
    }
    判断接口类型为scsi,然后看看PNPdeviceID是否存在,如果不存在就是拔除。才给50分,太吝啬了点把,给200分!
      

  5.   

    linux下你可以遍历 /dev/ 下的硬盘设备
    也可以调用 fdisk 然后分析他的结果。