Microsoft SQL Server
Скрипты
Другие

Список работающих локальных серверов на С++

Опубликовано: 14 сен 04
Рейтинг:

Автор: Lepsik
Прислал: Lepsik

// функция проверки состояния сервиса

#include <registry.hpp>
//---------------------------------------------------------------------------
bool ServiceIsRunning( String name_comp, String name_service ) 
{
  _SERVICE_STATUS svc_status;
  svc_status.dwCurrentState = 1;
  SC_HANDLE h_manager = OpenSCManager( name_comp.c_str(), NULL, SC_MANAGER_CONNECT);
  if( h_manager <= NULL )
    return false;
  bool result = false;
  SC_HANDLE h_svc = OpenService(h_manager, name_service.c_str(), SERVICE_QUERY_STATUS);
  if( h_svc >  NULL )
  {
      if( QueryServiceStatus( h_svc, &svc_status ) )
        result = (SERVICE_RUNNING == svc_status.dwCurrentState);
     CloseServiceHandle(h_svc);
  }
  CloseServiceHandle(h_manager);
  return result;
}
достать список локальным сервиcов из registry
//---------------------------------------------------------------------------
vector<String> LocalMSSQLServerListRegistry()   
{
    vector<String> result;
    TRegistry *reg = new TRegistry;
    reg->Access = KEY_READ;
    reg->RootKey = HKEY_LOCAL_MACHINE;
    String key_name = "SOFTWARE\\Microsoft\\Microsoft SQL Server\\";

    char *list_servers = new char[1024];
    int sz = 1024;
    if( reg->KeyExists( key_name ) )
          if( reg->OpenKey(key_name, false) )
          {
              sz = reg->GetDataSize("InstalledInstances");
              reg->ReadBinaryData( "InstalledInstances", list_servers, sz );
          }
    int pos=NULL; 
    for(int i = 0; i < sz; i++)
        if( list_servers[i] == '\0' )
        {
            String name_instance = (list_servers + pos);
            if( name_instance != NULL && !name_instance.IsEmpty() )
                result.push_back(name_instance);
            pos = i+1;
        }
    delete [] list_servers;
    delete reg;
    return result;
}
проверить какие из сервисов запущены и вернуть актуальный список
при этом в качестве Default имени возвращается имя компьютера вместо (local)
vector<String> LocalMSSQLServerList()   // from registry
{
    vector<String> result;
    vector<String> lst = LocalMSSQLServerListRegistry();
    String name_comp = GetComputerName();
    for(unsigned i = 0; i < lst.size(); i++)
    {
        String name_instance = lst[i];
        String name_service ;
        bool isDefault = name_instance.AnsiCompareIC("MSSQLSERVER") == NULL;
        if( isDefault )
            name_service = name_instance;
        else
            name_service = "MSSQL$" + name_instance;

        if( ServiceIsRunning( name_comp, name_service ) ) 
            result.push_back(isDefault ? name_comp : name_instance);
    }
    return result;
}

Комментарии


  • to Max-xaM

    ваш метод давно устарел и не поддерживается на совеременных ОС. ПОд WOW64 и подавно. Впрочем и мой не читает x64 ветку в режиме WOW64

  • Вот вариант получше:
    #include <lm.h>

    LPSERVER_INFO_101 pServerEnum;
    DWORD dwResult, dwRead, dwTotal;

    dwResult = NetServerEnum( NULL, 101,
    (BYTE**) &pServerEnum,
    -1, &dwRead, &dwTotal,
    SV_TYPE_SQLSERVER,
    NULL, 0 );
    if ( dwResult == NERR_Success )
    for ( DWORD i=0; i<dwRead; i++ ) {
    // куда-нибудь вывести (экран и т.д.):
    /*
    AnsiString( (LPCWSTR) pServerEnum[ i ].sv101_name );
    AnsiString( (LPCWSTR) pServerEnum[ i ].sv101_comment );
    */
    }

  • Такое сработает, только если у меня SQL установлен. И выдаст только те, к которым уже была регистрация.



Необходимо войти на сайт, чтобы оставлять комментарии

Раздел FAQ: Microsoft SQL Server / Скрипты / Другие / Список работающих локальных серверов на С++