如何以编程方式将“作为服务登录”授予虚拟帐户

时间:2016-11-13 23:32:28

标签: c# windows windows-services

我正在按照本指南使用Windows服务的虚拟帐户:https://technet.microsoft.com/library/dd548356%28v=ws.10%29.aspx?f=255&MSPPError=-2147217396

因此,这些类型的帐户不是手动创建的,而只是隐式使用。本指南未提及,但还需要将“作为服务登录”权限授予不存在的虚拟帐户。

例如,SQL Server Express 2014将虚拟帐户用于其服务,并将其作为用户NT Service\MSSQL$SQLEXPRESS运行。安装后,您可以在“作为服务登录”帐户列表中找到帐户名称。

问题在于我不确定如何以编程方式将此权限授予虚拟帐户。我已经看过使用pinvoke使用LsaAddAccountRights函数,但它需要指定帐户的SID。我不认为虚拟帐户 是SID。

我如何授予登录作为虚拟帐户的服务权限,这与Microsoft使用SQL Server Express的方式相同?

2 个答案:

答案 0 :(得分:2)

事实证明,虚拟服务帐户并不明确需要"作为服务登录"权利被授予。

问题是登录名必须与使用它的服务的确切名称相匹配。因此,对于名为MyService的服务,登录名必须是" NT Service \ MyService"。它不能是任意帐户名称。

编辑:

从技术上讲,他们确实需要"作为服务登录"权限,但默认情况下会将其授予NT Service\ALL SERVICES权限。但是,用户可能已经修改了此权限。

答案 1 :(得分:1)

默认情况下,"作为服务登录"权利被授予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()。