Получить сведения об учетной записи службы Службы агента 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 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