如何以编程方式将 "Log on as a service" 授予虚拟帐户
How to programatically grant "Log on as a service" to a virtual account
我正在按照本指南将虚拟帐户用于 Windows 服务:https://technet.microsoft.com/library/dd548356%28v=ws.10%29.aspx?f=255&MSPPError=-2147217396
因此,这些类型的帐户不是手动创建的,而是隐式使用的。本指南没有提及,但也要求对不存在的虚拟帐户授予"Log on as a service"权限。
例如,SQL Server Express 2014 为其服务使用虚拟帐户,并像 NT Service\MSSQL$SQLEXPRESS
一样以用户身份运行它们。安装后,您可以在 "Log on as a service" 帐户列表中找到帐户名称。
问题是我不确定如何以编程方式将此权限授予虚拟帐户。我看过使用 pinvoke 使用 LsaAddAccountRights
函数,但它需要指定帐户的 SID。我不相信虚拟帐户 有 SID。
我如何将登录即服务权限授予虚拟帐户,就像 Microsoft 对 SQL Server Express 所做的那样?
事实证明,虚拟服务帐户并不明确需要授予 "Log on as a service" 权限。
问题是登录名必须与使用它的服务的确切名称相匹配。因此,对于名为 MyService 的服务,登录名必须正好是 "NT Service\MyService"。不能是任意的账户名。
编辑:
从技术上讲,他们确实需要 "Log on as a service" 权限,但这是默认授予的 NT Service\ALL SERVICES
权限。但是,此权限可能已被用户修改。
默认情况下,"log on as a service" 权限授予 ALL SERVICES
,因此您的自我回答表明您不需要明确添加每项服务。但是,如果配置已被修改,您可能需要这样做。 (这大概就是 SQL 安装程序这样做的原因。)
虚拟服务帐户 有 SID,它们与服务名称有 1:1 对应关系。如果您需要,甚至还有一个命令行工具可以提前计算它们:
C:\>sc showsid xyzzy
NAME: xyzzy
SERVICE SID: S-1-5-80-1601682549-2674398373-2289982826-1892655095-2161370298
我找不到一个API提前做这个计算,一旦你安装了服务(注意,登录权限只是为了服务成功启动,而不是为了安装它)您可以像查找任何其他 SID 一样查找 SID,例如 LookupAccountName()。
我正在按照本指南将虚拟帐户用于 Windows 服务:https://technet.microsoft.com/library/dd548356%28v=ws.10%29.aspx?f=255&MSPPError=-2147217396
因此,这些类型的帐户不是手动创建的,而是隐式使用的。本指南没有提及,但也要求对不存在的虚拟帐户授予"Log on as a service"权限。
例如,SQL Server Express 2014 为其服务使用虚拟帐户,并像 NT Service\MSSQL$SQLEXPRESS
一样以用户身份运行它们。安装后,您可以在 "Log on as a service" 帐户列表中找到帐户名称。
问题是我不确定如何以编程方式将此权限授予虚拟帐户。我看过使用 pinvoke 使用 LsaAddAccountRights
函数,但它需要指定帐户的 SID。我不相信虚拟帐户 有 SID。
我如何将登录即服务权限授予虚拟帐户,就像 Microsoft 对 SQL Server Express 所做的那样?
事实证明,虚拟服务帐户并不明确需要授予 "Log on as a service" 权限。
问题是登录名必须与使用它的服务的确切名称相匹配。因此,对于名为 MyService 的服务,登录名必须正好是 "NT Service\MyService"。不能是任意的账户名。
编辑:
从技术上讲,他们确实需要 "Log on as a service" 权限,但这是默认授予的 NT Service\ALL SERVICES
权限。但是,此权限可能已被用户修改。
默认情况下,"log on as a service" 权限授予 ALL SERVICES
,因此您的自我回答表明您不需要明确添加每项服务。但是,如果配置已被修改,您可能需要这样做。 (这大概就是 SQL 安装程序这样做的原因。)
虚拟服务帐户 有 SID,它们与服务名称有 1:1 对应关系。如果您需要,甚至还有一个命令行工具可以提前计算它们:
C:\>sc showsid xyzzy
NAME: xyzzy
SERVICE SID: S-1-5-80-1601682549-2674398373-2289982826-1892655095-2161370298
我找不到一个API提前做这个计算,一旦你安装了服务(注意,登录权限只是为了服务成功启动,而不是为了安装它)您可以像查找任何其他 SID 一样查找 SID,例如 LookupAccountName()。