web-dev-qa-db-fra.com

Accordez des autorisations d'administrateur système à «NT AUTHORITY \ SYSTEM»

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.

  1. 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?

  2. 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.

6
mosg

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 ...

2
Serg