【问题标题】:Detecting elevated privileges on Windows Server 2008 or higher在 Windows Server 2008 或更高版本上检测提升的权限
【发布时间】:2016-05-02 22:31:51
【问题描述】:

我有一个在 Windows Server 平台(2008 或更高版本)上运行的 C#、.Net 4.6.1 Windows 窗体应用程序,需要“以管理员身份运行”。需要提升权限,因为应用程序会更改各种文件夹的用户访问权限(如果重要,则在 IIS 默认网站根目录下)。

我无法检测应用程序是否已“以管理员身份运行”。如果我正常启动应用程序(即不是作为管理员)以下代码

var isAdmin = WindowsIdentity.GetCurrent().Owner.IsWellKnown(WellKnownSidType.BuiltinAdministratorsSid);

返回 true,但更改目录上某些用户访问权限的代码失败并出现权限不足错误。

如果我以管理员身份运行应用程序,上述检查也会返回true,但更改用户访问权限就可以了。

我做过的其他尝试都没有成功:

  • 按照建议 here 使用 advapi32.dll 中的 GetTokenInformation 方法
  • 将清单文件添加到我将requestedExecutionLevel 设置为requireAdministrator 的应用程序

提前感谢您的帮助。

【问题讨论】:

  • 作为一种解决方法,您可以最初检查一下,您是否可以更改特定文件夹的访问权限,如果没有,请通知用户权限不足。不幸的是,我对这种代码没有直接经验,无法给出有用的答案:(
  • 谢谢@Arvo。我现在实施了类似的解决方法。还是想找到答案。
  • 那么当您使用清单时实际发生了什么?
  • 您想知道当前运行程序的用户是管理员还是应用程序以管理员权限启动 -> “以管理员身份运行”。 Because currently you checking if the user is admin.
  • 重复?见this,例如

标签: c# privileges access-control windows-server administrator


【解决方案1】:

尝试更改已知文件夹的权限,如果出现异常,则表明该程序尚未以管理员身份运行。

【讨论】:

  • 我认为 OP 正在寻找更优雅的解决方案,因为根据他的问题,他已经收到了权限不足的错误。
  • 我支持上面提到的@Dave。我已经实施了这样的解决方法。但这并不能回答我的问题。
  • @Matthias 据我所知,确定程序是否以管理员身份运行很棘手。不知道我真的可以帮助你更多。就更优雅的解决方案而言,我不确定有什么。我很好奇为什么清单更改对您不起作用?
【解决方案2】:

以下必须有效(我希望如此;我有一个 Windows 客户端,它可以与我一起工作)。

var Identity = WindowsIdentity.GetCurrent();
var Principal = new WindowsPrincipal(Identity);
bool IsAdmin = Principal.IsInRole(WindowsBuiltInRole.Administrator);

【讨论】:

  • 如果将 || Principal.IsInRole(0x200) 添加到 IsAdmin 布尔值,它还应该检测域管理员,对于本地组管理员,0x220 的计数相同。 MSDN
  • 我在我的 OP 中声明我使用这样的代码没有成功。
  • 你说.Owner.IsWellKnown...使用没有成功,上面的代码没有说明,你试过这个具体的代码吗?您可能只在寻找“0x200”标志,因为本地管理员可能无法更改 UAC 权限。
  • @Arena 我试过你的代码,但是当beeing正常执行和“以管理员身份运行”时,它会产生相同的结果。
  • @Matthias 您确定该文件夹不是symbolic link 中所述的this issue 吗?
猜你喜欢
  • 1970-01-01
  • 2018-04-05
  • 1970-01-01
  • 2012-03-14
  • 2013-09-08
  • 1970-01-01
  • 2013-11-09
  • 2011-09-02
相关资源
最近更新 更多