SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
Create procedure [dbo].[usp_CollectLocalAdmins]
as
-- list all members of Local Administrators group
set nocount on
declare @tsql nvarchar(1000)
create table #Output (output varchar(1000))
set @tsql= 'xp_cmdshell ''powershell -c "$([ADSI]''''WinNT://' + @@servername + '/Administrators,group'''').psbase.Invoke(''''Members'''') | foreach { $_.GetType().InvokeMember(''''ADspath'''', ''''GetProperty'''', $null, $_, $null).Replace(''''WinNT://'''', '''''''') }"'''
insert into #Output
exec sp_executesql @tsql
select
@@servername ServerName,
output MemberName
from #Output o
drop table #output
go
您不需要为此使用 Powershell,这需要在存储过程中使用 xp_cmdshell。只需使用 xp_logininfo。只要将组添加到SQL Server(你不必给它任何权限),你就可以查询它的成员。
您可以使用此存储过程来收集系统上的本地管理员,只要它在 sysadmin 角色成员的上下文中运行即可。