Pour SQL Server 2012 et supérieur, comme Quoi de neuf dans l'installation de SQL Server indique:
BUILTIN\administrators et Système local ( NT AUTHORITY\SYSTEM ) ne sont pas automatiquement provisionnés dans le rôle de serveur fixe sysadmin.
Dans mon cas, cela est devenu un problème: j'ai un installateur WiX qui utilise un Custom Action
Code C++ pour configurer les données de la base de données (créer la base de données, les vues, les procédures, les données, etc.). Custom Action
s'exécute en tant qu'utilisateur NT AUTHORITY\SYSTEM
, mais ce compte n'est pas autorisé à exécuter CREATE DATABASE
scripts.
Est-il correct de donner à sysadmin
un rôle à NT AUTHORITY\SYSTEM
lors de l'installation du logiciel? Ou peut-être existe-t-il une meilleure solution?
S'il est correct, est-il possible de trouver le nom d'utilisateur correct pour NT AUTHORITY\SYSTEM
? J'ai besoin de ce nom pour changer les permissions *. Dans différents pays, ce nom est différent, par exemple, NT AUTHORITY\SYSTEM
ou NT AUTHORITY\СИСТЕМА
.
Ajouter NT AUTHORITY\SYSTEM
au rôle sysadmin
:
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'
Recherche sys.server_principals
pour name LIKE 'NT AUTHORITY\%'
ne fonctionnera pas car parfois il y en aura plusieurs NT AUTHORITY\...
utilisateur. J'ai rencontré un cas comme celui-là sur l'une de mes machines virtuelles.
Vous pouvez obtenir le nom de identificateurs de sécurité bien connus (SID) à l'aide d'un script PowerShell:
$objSID = New-Object System.Security.Principal.SecurityIdentifier ("S-1-5-18")
$objUser = $objSID.Translate( [System.Security.Principal.NTAccount])
$objUser.Value
Personnellement, je n'ai jamais eu à le faire à partir du code C/C++. Voir article MSDN à propos de WINAPI ou System.Security
espace de noms pour le code managé.
Il y a un exemple compact dans le Stack Overflow Q&A WinAPI LookupAccountSid à partir d'un fichier .evt by Remy Lebea :
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"";
}
Y a-t-il un problème pour placer NT AUTHORITY\SYSTEM
dans le rôle SQL Server sysadmin
lors de l'installation du logiciel à partir d'une source fiable? Il ne devrait pas y avoir de problème, j'espère, mais qui sait ...