SQL Server 2012以降の場合 SQL Serverのインストールの新機能 の状態:
BUILTIN\administratorsおよびLocal System(NT AUTHORITY\SYSTEM)は、sysadmin固定サーバーロールで自動的にプロビジョニングされません。
私の場合、これが問題になりました。Custom Action
C++コードを使用してデータベースデータをセットアップする(データベース、ビュー、プロシージャ、データなどを作成する)WiXインストーラーがあります。 Custom Action
はユーザーNT AUTHORITY\SYSTEM
として実行されますが、このアカウントにはCREATE DATABASE
スクリプトを実行する権限がありません。
ソフトウェアのインストール中にNT AUTHORITY\SYSTEM
にsysadmin
の役割を与えることは正しいですか?それとももっと良い解決策がありますか?
正しい場合、NT AUTHORITY\SYSTEM
の適切なユーザー名を見つけることは可能ですか?権限を変更するには、この名前が必要です*。ロケールによって、この名前は異なります(例:NT AUTHORITY\SYSTEM
またはNT AUTHORITY\СИСТЕМА
)。
sysadmin
ロールにNT AUTHORITY\SYSTEM
を追加:
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_principals
でname LIKE 'NT AUTHORITY\%'
を検索すると、複数のNT AUTHORITY\...
ユーザーが存在する場合があるため、機能しません。仮想マシンの1つでそのようなケースに遭遇しました。
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またはSystem.Security
名前空間については MSDNの記事 を参照してください。
スタックオーバーフローのQ&Aにコンパクトな例があります 。evtファイルからのWinAPI LookupAccountSidRemy 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"";
}
信頼できるソースからソフトウェアをインストールするときに、SQL Server sysadmin
ロールにNT AUTHORITY\SYSTEM
を配置するときに問題はありますか?問題ないはずですが、誰が知っているのでしょう...