Sql-Server

將系統管理員權限授予“NT AUTHORITYSYSTEM”

  • April 18, 2017

對於 SQL Server 2012 及更高版本,如SQL Server 安裝中的新增功能所述:

BUILTIN\administrators本地系統( NT AUTHORITY\SYSTEM ) 不會自動配置為 sysadmin 固定伺服器角色。

就我而言,這已成為一個問題:我有一個 WiX 安裝程序,它使用Custom ActionC++ 程式碼設置數據庫數據(創建數據庫、視圖、過程、數據等)。Custom Action以使用者身份執行NT AUTHORITY\SYSTEM,但此帳戶無權執行CREATE DATABASE腳本。

  1. 在安裝軟體時賦予sysadmin角色是否正確?NT AUTHORITY\SYSTEM或者也許有更好的解決方案?
  2. 如果正確,是否可以找到正確的使用者名NT AUTHORITY\SYSTEM?我需要此名稱才能更改權限*。在不同的語言環境中,此名稱是不同的,例如,NT AUTHORITY\SYSTEMNT AUTHORITY\СИСТЕМА

添加NT AUTHORITY\SYSTEMsysadmin角色:

IF NOT EXISTS
(
   SELECT name
   FROM master.sys.server_principals 
   WHERE IS_SRVROLEMEMBER ('sysadmin', name) = 1 
   AND name LIKE 'NT AUTHORITY\SYSTEM'
)
EXEC master..sp_addsrvrolemember
   @loginame = N'NT AUTHORITY\SYSTEM', @rolename = N'sysadmin'

搜尋sys.server_principalsname LIKE 'NT AUTHORITY\%'不起作用,因為有時會有多個NT AUTHORITY\...使用者。我在我的一台虛擬機上遇到過這樣的情況。

您可以使用 PowerShell 腳本獲取知名安全標識符(SID) 的名稱:

$objSID = New-Object System.Security.Principal.SecurityIdentifier ("S-1-5-18")
$objUser = $objSID.Translate( [System.Security.Principal.NTAccount])
$objUser.Value

就我個人而言,我從來不必從 C/C++ 程式碼中執行此操作。請參閱有關託管程式碼的 WINAPI 或命名空間的MSDN 文章。System.Security

在Remy Lebeau的 .evt 文件的 Stack Overflow Q & A WinAPI LookupAccountSid中有一個簡潔的例子:

static const DWORD MAX_BUFF_SIZE = 256;

wstring userNameFromSid(SID userSid, wstring computerName)
{
   wchar_t buffName[MAX_BUFF_SIZE];
   DWORD buffNameSize = MAX_BUFF_SIZE;
   wchar_t buffDomain[MAX_BUFF_SIZE];
   DWORD buffDomainSize = MAX_BUFF_SIZE;
   SID_NAME_USE SidType;

   if (LookupAccountSid(!computerName.empty() ? computerName.c_str() : NULL, &userSid, buffName, &buffNameSize, buffDomain, &buffDomainSize, &SidType))
   {
       return buffName;
   }

   /*Here some code to print error in a Message box*/
   return L"";
}

從可靠來源安裝軟體時,放置NT AUTHORITY\SYSTEMSQL Server角色是否有任何問題?sysadmin應該沒有問題,我希望,但誰知道…

引用自:https://dba.stackexchange.com/questions/142166