SQLエージェントサービスのサービスアカウントの詳細を取得します
-
27-10-2019 - |
質問
特定のSQLサーバーのSQLエージェントサービスのサービスアカウント名を取得するにはどうすればよいですか(SQL 2005)。 SQLステートメントまたはWMIを使用することは可能ですか?
解決
使用できます 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から始めて、より良い方法があります。
記事から T-SQLでSQL Serverサービスアカウントを識別する方法, 、使用できます 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サーバーはWindowsサービスとして実行されるため、使用できます wmic 開始名を照会します。
wmic service where "name Like 'MSSQL%'" get Name , StartName
私にとってこれは次の出力を出力します(私は複数のインスタンスも持っているので、THOESが含まれています)
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 (リモート/複数の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;
指定されたインスタンスの場合、次の2番目の引数が必要です。
'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