【问题标题】:Get Service Account Details of the SQL Agent Service获取 SQL 代理服务的服务帐户详细信息
【发布时间】:2011-09-06 18:25:03
【问题描述】:

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

【问题讨论】:

  • 询问 DBA 确实是获取此信息的最合适方式。我知道我不希望任何人试图以编程方式浏览我的 SQL Server 以找出运行服务的帐户。

标签: sql sql-server sql-server-2005 wmi-query


【解决方案1】:

正如 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;

【讨论】:

    【解决方案2】:

    由于 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
    

    【讨论】:

      【解决方案3】:

      对于默认实例:

      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(如评论中所建议的那样),或者,如果您可以访问物理机,只需检查控制面板中的服务帐户。

      【讨论】:

      • 请注意,如果您已命名实例,则应将 MSSQL$InstanceName 替换为 SQLAGENT$InstanceName 否则您将查看 SQL 数据库服务的服务帐户而不是 SQL 代理。
      【解决方案4】:

      您可以使用sc.exe

      要查找 SQL 实例服务:

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

      获取配置:

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

      【讨论】:

      • 如果你想使用 powershell,请确保使用sc.exe 调用它,这样你就不要使用set-content 的别名。正如this article 中提到的,您还可以使用更多的Powershell 友好命令,例如Get-Service
      【解决方案5】:

      我知道这是一个旧线程,但这是我的解决方案。这已经针对 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
      

      【讨论】:

        猜你喜欢
        • 2020-08-03
        • 1970-01-01
        • 2017-07-16
        • 1970-01-01
        • 1970-01-01
        • 2019-02-09
        • 1970-01-01
        • 2010-11-26
        • 2016-12-20
        相关资源
        最近更新 更多