Получить сведения об учетной записи службы Службы агента SQL

Как получить имя учетной записи службы для службы агента SQL для конкретного SQL Server (SQL 2005). Можно ли получить с помощью операторов SQL или WMI ?

5 ответов


можно использовать sc.exe.

чтобы найти службы экземпляров SQL:

sc \<remote computer name> query | find /i "sql"

чтобы получить конфигурацию:

sc \<remote computer name> qc <service name from listing above>

как отметил Аарон Бертран, вы можете использовать недокументированные xp_regread в SQL Server 2005 и SQL Server 2008, но есть лучший способ, начиная с SQL Server 2008R2 SP1.

из статьи как определить учетную запись службы SQL Server в T-SQL, вы можете использовать sys.dm_server_services такой:

SELECT  DSS.servicename,
        DSS.startup_type_desc,
        DSS.status_desc,
        DSS.last_startup_time,
        DSS.service_account,
        DSS.is_clustered,
        DSS.cluster_nodename,
        DSS.filename,
        DSS.startup_type,
        DSS.status,
        DSS.process_id
FROM    sys.dm_server_services AS DSS;

SQL Service Account Query Results


поскольку SQL Server работает как служба windows, вы можете использовать wmic для запроса начального имени.

wmic service where "name Like 'MSSQL%'" get Name , StartName

для меня это выводит следующее (Так как у меня есть несколько экземпляров, которые также включены)

Name                    StartName
MSSQL$SQLEXPRESS        NT AUTHORITY\NetworkService
MSSQL$SQLEXPRESS2005    NT AUTHORITY\NetworkService
MSSQLFDLauncher         NT AUTHORITY\NETWORK SERVICE
MSSQLSERVER             NT AUTHORITY\NETWORK SERVICE
MSSQLServerADHelper     NT AUTHORITY\NetworkService
MSSQLServerADHelper100  NT AUTHORITY\NETWORK SERVICE
MSSQLServerOLAPService  NT AUTHORITY\NETWORK SERVICE

вы можете добавить /NODE запрос к удаленным компьютерам. Как и для любого запроса WMI, вам понадобятся достаточные привилегии, чтобы это работало

или тот же запрос с использованием в PowerShell сделать-WmiObject (поддерживает remote / multiple computersnames):

Get-WmiObject Win32_Service -ComputerName localhost,W-Remote -Filter "name Like 'MSSQL%'" | ft __Server,State,Name,DisplayName,StartName -AutoSize

Пример Вывода:

__SERVER State   Name                   DisplayName                         StartName
-------- -----   ----                   -----------                         ---------
W0123456 Stopped MSSQL$SQLEXPRESS       SQL Server (SQLEXPRESS)             NT AUTHORITY\NETWORK SERVICE
W0123456 Running MSSQLSERVER            SQL Server (MSSQLSERVER)            LocalSystem
W0123456 Stopped MSSQLServerADHelper100 SQL Active Directory Helper Service NT AUTHORITY\NETWORKSERVICE
W-REMOTE Stopped MSSQL$SQLEXPRESS       SQL Server (SQLEXPRESS)             NT AUTHORITY\NETWORK SERVICE
W-REMOTE Running MSSQLSERVER            SQL Server (MSSQLSERVER)            LocalSystem

для экземпляра по умолчанию:

DECLARE @sn NVARCHAR(128);

EXEC master.dbo.xp_regread
    'HKEY_LOCAL_MACHINE',
    'SYSTEM\CurrentControlSet\services\SQLSERVERAGENT',
    'ObjectName', 
    @sn OUTPUT;

SELECT @sn;

для именованного экземпляра вам понадобится второй аргумент:

    'SYSTEM\CurrentControlSet\services\SQLAGENT$InstanceName',

теперь это может не работать, потому что у вас может не быть доступа к xp_regread, и расположение этого свойства может изменяться от версии к версии (я тестировал только 2008, 2008 R2 и Denali - у меня нет экземпляра 2005, который можно проверить).

в любом случае вам, вероятно, лучше спросить DBA (как предложено в комментарии) или, если у вас есть доступ на физическую машину, просто проверяя учетную запись службы на панели управления.


Я знаю, что это старый нить, но вот мое решение. Это было протестировано против SQL Server 2000, 2005, 2008, 2008 R2, 2012, 2014 и 2016.

if (select CONVERT(INT, (REPLACE(SUBSTRING(convert(nvarchar, SERVERPROPERTY('ProductVersion')), 1, 2), '.', '')))) >10
BEGIN
select distinct(service_account) AS SvcAccount from sys.dm_server_services;
END

ELSE
BEGIN
DECLARE @instanceName varchar(100)
set @instanceName    = convert(varchar,SERVERPROPERTY ('InstanceName'))
IF (@instanceName) IS NULL
begin
DECLARE @sn NVARCHAR(128);
EXEC master.dbo.xp_regread
    'HKEY_LOCAL_MACHINE',
    'SYSTEM\CurrentControlSet\services\SQLSERVERAGENT',
    'ObjectName', 
    @sn  OUTPUT ;

SELECT @sn AS SvcAccount;
END
ELSE
BEGIN 

DECLARE @SQL varchar (500)
SET @SQL  = 'DECLARE @sn NVARCHAR(128); exec master.dbo.xp_regread ''HKEY_LOCAL_MACHINE'', ''SYSTEM\CurrentControlSet\services\SQLAgent$'+@instanceName+''',''ObjectName'', @sn OUTPUT; SELECT @sn AS SvcAccount;'
EXEC (@SQL)

END
END