如何获取特定SQL Server的SQL代理服务的服务帐户名称(SQL 2005)。 是否可以使用SQL语句或WMI?
答案 0 :(得分:9)
正如Aaron Bertrand所指出的,您可以在SQL Server 2005和SQL Server 2008中使用未记录的xp_regread
,但有一种更好的方法,从SQL Server 2008R2 SP1开始。
在文章How to identify the SQL Server Service Account in 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;
答案 1 :(得分:8)
由于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's Get-WmiObject进行相同的查询(支持远程/多台计算机名称):
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
答案 2 :(得分:7)
对于默认实例:
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(如评论中所述),或者,如果您有权访问物理机,只需检查控制面板中的服务帐户。
答案 3 :(得分:3)
您可以使用sc.exe。
查找SQL实例服务:
sc \\<remote computer name> query | find /i "sql"
获取配置:
sc \\<remote computer name> qc <service name from listing above>
答案 4 :(得分:1)
我知道这是一个旧线程,但这是我的解决方案。这已针对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