2014-09-22 135 views
-1

我想运行应用程序通常具有正常的权利,但对于一些操作(例如管理文件关联)请求管理员权限。请求管理权的应用程序的某些操作(没有全职管理员权限)

可能吗?

P.S.我知道清单和requestedExecutionLevel,但这不是一个好的解决方案。我希望应用程序有一段时间的管理权限不总是。

+0

如何处理一个事件,当它发生时检查管理权限(就像它在这篇文章中提到的:http://stackoverflow.com/questions/1089046/in-net-c-test-if用户是一个管理员用户),否则操作是不可能的 – patdhlk 2014-09-22 08:29:14

+0

@Ruslan您接受的答案绝对是解决此问题的错误方法。在MSDN的许多地方都详细描述了正确的方法。 – 2014-09-29 12:27:42

回答

1

这是不可能的,除非你开始一个新的过程。

你可以做到这一点:

var psi = new ProcessStartInfo(); 
psi.FileName = @"yourExe"; 
psi.Verb = "runas"; 

Process.Start(psi); 

你可以为当前运行启动同一应用程序,并通过一个开关参数,这样的问题只知道它必须执行特定的操作。

+0

-1你错了。 – Sheridan 2014-09-22 09:39:40

+0

是的,如果你能给我一点时间,我会提供一个完整的答案。总之,您可以使用模拟和['WindowsImpersonationContext'类](http://msdn.microsoft.com/zh-cn/library/system.security.principal.windowsimpersonationcontext(v = vs.110).aspx)达到这些要求。 – Sheridan 2014-09-22 09:42:33

+1

+1删除了投票。我会很快删除这些评论。 – Sheridan 2014-09-22 09:58:51

1

您可以使用模拟和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()); 
} 
+0

谢谢。我理解了这个想法,并在稍后尝试。 – 2014-09-22 10:07:46

+0

如果这样做,我觉得很难相信它,它真的很难。你要从哪里获得用户名和密码?正确的做法是通过另一个过程。无论是简单地使用'runas'动词和'ShellExecuteEx'开始一个新的过程。 Process.Start()'在.net下使用'UseShellExecute'。或者通过使用COM UAC标高标识符。 – 2014-09-29 12:24:58

+0

它工作得非常好,谢谢...什么会让你觉得它不工作?这真的很简单的代码。密码和用户名仅存储在设置文件中。我从来没有遇到任何问题,但如果我这样做,我会回来尝试你的建议。 – Sheridan 2014-09-29 13:03:49

相关问题