如何将本地安全策略权限检查为非管理员

时间:2015-06-22 23:56:54

标签: c# pinvoke privileges

情境是运行c#代码的客户端系统,在启动时我们希望检查并确认运行系统的Windows标识具有某些特定权限,当前特定情况是SeSystemtimePrivilege。 我们不希望要求用户成为系统启动的管理员。

到目前为止尝试的路径包括:

  • WMI没有得到我们追求的权利。

  • LsaEnumerateAccountsWithUserRight通过PInvoke - 完全有效,但需要管理员权限才能使用LsaOpenPolicy。

  • 通过PInvoke获取GetTokenInformation,与LookupPrivilegeName一起使用,但未返回所需的结果。相反,它仅返回令牌的5个权限,但不包括SeSystemtimePrivilege,尽管它已被明确授予相关用户。 (我认为它只向我展示了GP的权利?它们与我用cmd WhoAmI / priv检查看到的权利相同。)
  • LookupPrivilegeValue通过PInvoke与PrivilegeCheck一起使用,这似乎只能访问与GetTokenInformation相同的5个权限,并且只有在实际启用了该权限时才返回true。

到目前为止,我无法弄清楚如何在我的本地计算机上启用此功能来测试这种情况,但我认为我不能依赖客户端计算机上的默认设置。

我正在寻找更多关于如何获得这些用户权利而无需拥有管理员权限的想法。

想法?我已经筋疲力尽了吗?那可能不是这样,可以吗?

1 个答案:

答案 0 :(得分:0)

我的情况的答案原来是

  • GetTokenInformation通过PInvoke与LookupPrivilegeName一起使用 选项。

所以,我没有得到完全权利的原因,就是我认为的那样,分裂令牌。作为管理员,在将应用程序作为非提升程序运行时,您会获得两个令牌。这阻碍了完整的工作流程,直到涉及清单。获得我们所追求的完整管理员权限的关键是在此行中包含一个清单:

  • < requestedExecutionLevel level =" highestAvailable" uiAccess ="假" />

然后变得更容易。管理员可以非升级运行应用程序,GetTokenInformation将返回完整的管理员权限集,其中包括我们的目标SeSystemtimePrivilege(我们不在任何人限制管理员权限的系统上)。对于标准用户,我们在本地安全策略中明确授予他们SeSystemtimePrivilege,然后以他们的令牌权限返回权限。

两种情况都得到了补救。它需要设置VM来测试标准用户等,由于其他原因,这种情况很慢。但无论如何,它确实有效,并满足我们的需求。

我希望这有助于其他人!