在Windows Server 2008或更高版本上检测提升的权限

12

我有一个在Windows服务器平台(2008或更高版本)上运行的C#,.Net 4.6.1 Windows Forms 应用程序,需要以“管理员身份运行”。需要提升权限,因为该应用程序会更改各个文件夹(如果相关,则位于IIS默认 Web Site根目录下)下的用户访问权限。

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

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

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

如果我以管理员身份运行应用程序,则上述检查也返回true,但更改用户访问权限正常工作。

我尝试过其他方法但均未成功:

  • 此处建议使用advapi32.dll中的GetTokenInformation方法
  • 向应用程序添加清单文件,将requestedExecutionLevel设置为requireAdministrator

提前感谢您的帮助。


作为一种解决方法,您可以首先检查是否可以更改特定文件夹的访问权限,如果不能,则通知用户权限不足。不幸的是,我没有直接处理这种代码的经验,无法给出有用的答案 :( - Arvo
谢谢@Arvo。我现在实施了一个类似的解决方法。仍然希望能找到答案。 - Mats
当您使用清单文件时,实际发生了什么? - Damien_The_Unbeliever
你想知道当前运行程序的用户是否是管理员,或者应用程序是否以管理员权限启动 -> "以管理员身份运行"。[因为目前你正在检查用户是否为管理员。] (https://dev59.com/q3A65IYBdhLWcg3w2iep) - C0d1ngJammer
1
重复?请参见此链接 - sq33G
显示剩余2条评论
2个回答

2
以下代码必须正常工作(我希望如此;我使用的是Windows客户端,它能够正常运行)。
var Identity = WindowsIdentity.GetCurrent();
var Principal = new WindowsPrincipal(Identity);
bool IsAdmin = Principal.IsInRole(WindowsBuiltInRole.Administrator);

我在我的原帖中声明我使用过类似的代码但没有成功。 - Mats
@Arena 我尝试了你的代码,但在正常执行和“以管理员身份运行”时产生了相同的结果。 - Mats
@Matthias 你确定这个文件夹不是一个符号链接,就像这个问题中所描述的那样吗? - Arena
@Arena 100%确定。这不是符号链接。这是一个文件夹 ;) - Mats
我想感谢Arena做出的贡献,很抱歉听到我没有任何Windows服务器版本来测试我的代码的问题。我已经在Windows 7上尝试过了,并且它完美地工作了。而且真的很奇怪这个代码在客户端版本上能够运行但却与服务器版本不兼容。无论如何,当我发现有关服务器版本的新信息时,我会更新帖子。祝你好运。 - Ahmad Alloush
显示剩余2条评论

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

我认为楼主正在寻找更优雅的解决方案,因为他已经根据问题得到了权限不足的错误提示。 - Lemonseed
1
我赞同上面@Dave所说的。我已经实现了这样一个解决方法,但这并没有回答我的问题。 - Mats
据我所知,确定程序是否以管理员身份运行有一定的技巧。我不确定我是否可以为你提供更多帮助。至于更优雅的解决方案,我不确定是否有什么。我很好奇为什么您的清单更改没有起作用? - Dave3of5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接