Опубликовано: 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 установлен. И выдаст только те, к которым уже была регистрация.