为某些操作请求应用程序的管理员权限(没有全职管理员权限)

本文关键字:权限 管理员 请求 操作 应用程序 | 更新日期: 2023-09-27 18:23:56

我想通常使用正常权限运行应用程序,但对于某些操作(例如管理文件关联),请求管理员权限。

有可能吗?

附言:我知道manifest和requestedExecutionLevel,但这不是一个好的解决方案。我希望应用程序在一段时间内拥有管理权限,但并不总是如此。

为某些操作请求应用程序的管理员权限(没有全职管理员权限)

除非启动新流程,否则这是不可能的。

你可以用

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

您可以启动与当前运行的应用程序相同的应用程序,并传递开关参数,这样问题就知道它只需要执行特定的操作。

您可以使用模拟和WindowsImpersonationContext类来满足您的需求。其想法是,应用程序以正常权限运行,但当您需要访问具有更高权限的内容时,应用程序可以提供具有正确权限的用户帐户的登录详细信息。它看起来像这样:

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());
}