10

如何获取特定 SQL Server (SQL 2005) 的 SQL 代理服务的服务帐户名称。是否可以使用 SQL 语句或 WMI?

4

5 回答 5

9

正如 Aaron Bertrand 所指出的,您可以使用xp_regreadSQL Server 2005 和 SQL Server 2008 中未记录的内容,但有更好的方法,从 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;

SQL 服务帐号查询结果

于 2015-05-26T18:07:58.970 回答
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 的 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
于 2011-09-06T19:34:03.500 回答
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(如评论中所建议的那样),或者,如果您可以访问物理机,只需检查控制面板中的服务帐户。

于 2011-09-06T19:05:26.740 回答
3

您可以使用sc.exe

要查找 SQL 实例服务:

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

获取配置:

sc \\<remote computer name> qc <service name from listing above>
于 2013-08-08T13:38:29.930 回答
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
于 2017-05-25T21:16:31.370 回答