请求管理权的应用程序的某些操作(没有全职管理员权限)
我想运行应用程序通常具有正常的权利,但对于一些操作(例如管理文件关联)请求管理员权限。请求管理权的应用程序的某些操作(没有全职管理员权限)
可能吗?
P.S.我知道清单和requestedExecutionLevel,但这不是一个好的解决方案。我希望应用程序有一段时间的管理权限不总是。
这是不可能的,除非你开始一个新的过程。
你可以做到这一点:
var psi = new ProcessStartInfo();
psi.FileName = @"yourExe";
psi.Verb = "runas";
Process.Start(psi);
你可以为当前运行启动同一应用程序,并通过一个开关参数,这样的问题只知道它必须执行特定的操作。
-1你错了。 – Sheridan 2014-09-22 09:39:40
是的,如果你能给我一点时间,我会提供一个完整的答案。总之,您可以使用模拟和['WindowsImpersonationContext'类](http://msdn.microsoft.com/zh-cn/library/system.security.principal.windowsimpersonationcontext(v = vs.110).aspx)达到这些要求。 – Sheridan 2014-09-22 09:42:33
+1删除了投票。我会很快删除这些评论。 – Sheridan 2014-09-22 09:58:51
您可以使用模拟和WindowsImpersonationContext
Class来实现您的要求。这个想法是应用程序以普通权限运行,但是当您需要访问权限较高的应用程序时,应用程序可以提供具有正确权限的用户帐户的详细日志。这将是这个样子:
using (ImpersonationManager impersonationManager = new ImpersonationManager())
{
impersonationManager.Impersonate(Settings.Default.MediaAccessDomain,
Settings.Default.MediaAccessUserName, Settings.Default.MediaAccessPassword);
// Perform restricted action as other user with higher permissions here
}
注意,这ImpersonationManager
类是一个自定义类,所以你不会找到它在MSDN上,但它只是使用了SafeTokenHandle
和其他代码链接的页面:
private SafeTokenHandle safeTokenHandle;
private WindowsImpersonationContext impersonationContext;
const int LOGON32_LOGON_NEW_CREDENTIALS = 9;
[DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
private static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword, int dwLogonType, int dwLogonProvider, out SafeTokenHandle phToken);
public void Impersonate(string domain, string username, string password)
{
var isLoggedOn = LogonUser(username, domain, password, LOGON32_LOGON_NEW_CREDENTIALS, 0, out safeTokenHandle);
if (!isLoggedOn)
{
var errorCode = Marshal.GetLastWin32Error();
throw new ApplicationException(string.Format("Could not impersonate the elevated user. The LogonUser method returned error code {0}.", errorCode));
}
impersonationContext = WindowsIdentity.Impersonate(this.safeTokenHandle.DangerousGetHandle());
}
谢谢。我理解了这个想法,并在稍后尝试。 – 2014-09-22 10:07:46
如果这样做,我觉得很难相信它,它真的很难。你要从哪里获得用户名和密码?正确的做法是通过另一个过程。无论是简单地使用'runas'动词和'ShellExecuteEx'开始一个新的过程。 Process.Start()'在.net下使用'UseShellExecute'。或者通过使用COM UAC标高标识符。 – 2014-09-29 12:24:58
它工作得非常好,谢谢...什么会让你觉得它不工作?这真的很简单的代码。密码和用户名仅存储在设置文件中。我从来没有遇到任何问题,但如果我这样做,我会回来尝试你的建议。 – Sheridan 2014-09-29 13:03:49
如何处理一个事件,当它发生时检查管理权限(就像它在这篇文章中提到的:http://stackoverflow.com/questions/1089046/in-net-c-test-if用户是一个管理员用户),否则操作是不可能的 – patdhlk 2014-09-22 08:29:14
@Ruslan您接受的答案绝对是解决此问题的错误方法。在MSDN的许多地方都详细描述了正确的方法。 – 2014-09-29 12:27:42