问题 c#向Windows用户授予“作为服务登录”权限


如何为用户授予服务的LogOnAsService权限?

我需要手动执行此操作 SERVICES.MSC app我可以去服务,更改密码(设置与以前相同),点击申请,我收到一条消息:

帐户。\ postgres已经   授予登录身份服务权限。

我如何从代码中执行此操作,因为否则每次运行应用程序时我都必须手动授予此权限,这不可能

@Steve

    static void Main()
    {
        // irrelevant stuff

        GrantLogonAsServiceRight("postgres");

        // irrelevant stuff
    }

    private static void GrantLogonAsServiceRight(string username)
    {
        using (LsaWrapper lsa = new LsaWrapper())
        {
            lsa.AddPrivileges(username, "SeServiceLogonRight");
        }
    }

和这个家伙威利的LSA lib。


6113
2017-10-08 14:37


起源



答案:


看到 在C#中授予用户权限

您必须通过P / Invoke调用LSA API,并且该URL具有对a的引用 包装类 这样做对你来说。所以你最终得到的代码很简单:

private static void GrantLogonAsServiceRight(string username)
{
   using (LsaWrapper lsa = new LsaWrapper())
   {
      lsa.AddPrivileges(username, "SeServiceLogonRight");
   }
}

10
2017-10-08 17:27



听起来不错,但我得到Win32UnhandledException:参数不正确 - bevacqua
@Nico - 您的代码是什么样的? - Steve Townsend
阅读我的更新@original帖子 - bevacqua
@Nico - 在LSAWrapper里面你有例外吗?你可以使用'domain \\ name'吗? - Steve Townsend
帐号和安全ID之间没有映射,无论如何我得到了Sid,异常是在AddPrivileges()函数的末尾:抛出新的Win32Exception(Win32Sec.LsaNtStatusToWinError((int)ret)); - bevacqua


答案:


看到 在C#中授予用户权限

您必须通过P / Invoke调用LSA API,并且该URL具有对a的引用 包装类 这样做对你来说。所以你最终得到的代码很简单:

private static void GrantLogonAsServiceRight(string username)
{
   using (LsaWrapper lsa = new LsaWrapper())
   {
      lsa.AddPrivileges(username, "SeServiceLogonRight");
   }
}

10
2017-10-08 17:27



听起来不错,但我得到Win32UnhandledException:参数不正确 - bevacqua
@Nico - 您的代码是什么样的? - Steve Townsend
阅读我的更新@original帖子 - bevacqua
@Nico - 在LSAWrapper里面你有例外吗?你可以使用'domain \\ name'吗? - Steve Townsend
帐号和安全ID之间没有映射,无论如何我得到了Sid,异常是在AddPrivileges()函数的末尾:抛出新的Win32Exception(Win32Sec.LsaNtStatusToWinError((int)ret)); - bevacqua