0

我有一个自定义操作,用于提升用户能够作为服务登录。这将在安装程序期间运行。在 Windows Server 2012 之前,它在每个 Windows 操作系统上都可以正常工作多年。当下面的代码在这个版本的 Windows 上运行而不是long成功返回 0 时,我会得到一个不同的错误代码。

LsaAddAccountRights(
        IntPtr PolicyHandle,
        IntPtr AccountSid,
        LSA_UNICODE_STRING[] UserRights,
        long CountOfRights)

问题是代码似乎每次都不同,并且是一个非常大的数字,例如 102938473。

我通过以下方法运行错误代码以获取错误代码,但这会返回一个不同的大数字,它似乎不是有效的错误代码。

LsaNtStatusToWinError(long status)

我试过查找这些错误代码,但没有运气。它们似乎是随机生成的且毫无意义。

如果我忽略返回的错误代码,则似乎已成功允许用户作为服务登录。所以一切似乎都在工作,除了我得到一个错误代码。我可以忽略这个错误代码,但是当它是一个有效错误时会发生什么,我将来可能会忽略它。

额外的信息

我可以在控制台应用程序中自行运行自定义操作中的代码而不会出错。只有当它是 wix 安装程序的一部分时,它似乎不起作用。

4

2 回答 2

0

我会看一下 WiX Util 扩展的User element。name 属性可以是一个属性。使用 CreateUser、LogonAsService 和 UpdateIfExists 属性,您可以获取现有帐户并授予其权限。或者,也许您有更多可以重构的代码。

于 2013-08-30T10:30:55.593 回答
0

问题可能与 C# 中 LsaAddAccountRights 的返回类型有关。

我能够通过将 C# 中 LsaAddAccountRights 的返回类型从 long 更改为 UInt32 来解决该问题。在此处找到此信息。对于 LsaNtStatusToWinError 和 LsaClose 也必须进行此更改。

于 2018-02-13T08:33:47.363 回答