| Код | //Список работающих локальных серверов на С++
// функция проверки состояния сервиса#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; }
//Вот вариант получше: #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 установлен. И выдаст только те, к которым уже была регистрация.
|
|