使用管理员权限执行方法的最简单方法是什么?

时间:2012-05-14 16:23:01

标签: c# .net process administration

我目前只是在一个新流程中调用自己的程序:

MyProcessStartInfo.Verb = "runas";
MyProcessStartInfo.Arguments = "MyFlag";

当过程开始时,我检查标志。如果它在那里 - 我只是执行方法和Close();

但如果可以简单地完成,我宁愿做一些更简约的事情。这可能吗?

编辑:使用Vista和Windows7。

3 个答案:

答案 0 :(得分:2)

您无法提升正在运行的流程。它简单是不可能的。您通过使用提升的权限生成另一个进程,以正确的方式执行此操作。没有其他办法。

  

感谢。但我想也许有办法将方法作为一个新的过程启动。

您可以创建一个单独的应用程序可执行文件,其中包含您的方法,然后您就不需要重新启动应用程序了。您只需要启动其他过程。

答案 1 :(得分:1)

这不是简约,但你可以使用我从网上来源制作的这个属性。其中一些调用是pInvoke的。所以google'pinvoke方法'找到它们。

public static bool IsRunAsAdministrator
{
    get
    {
        WindowsIdentity windowsIdentity = WindowsIdentity.GetCurrent();
        if (windowsIdentity.IsSystem) return true;

        WindowsPrincipal windowsPrincipal = new WindowsPrincipal(windowsIdentity);
        if (windowsPrincipal.IsInRole(WindowsBuiltInRole.Administrator))
            return true;

        //Vista or higher check
        if (Environment.OSVersion.Version.Major >= 6)
        {
            IntPtr hToken = IntPtr.Zero;
            try
            {
                if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, out hToken))
                    Win32.ThrowLastError();

                TOKEN_ELEVATION_TYPE elevationType;
                IntPtr pElevationType = Marshal.AllocHGlobal(sizeof(TOKEN_ELEVATION_TYPE));
                uint dwSize;

                if (!GetTokenInformation(
                    hToken,
                    TOKEN_INFORMATION_CLASS.TokenElevationType,
                    pElevationType,
                    sizeof(TOKEN_ELEVATION_TYPE),
                    out dwSize
                    ))
                    Win32.ThrowLastError();

                elevationType = (TOKEN_ELEVATION_TYPE)Marshal.ReadInt32(pElevationType);
                Marshal.FreeHGlobal(pElevationType);

                return elevationType == TOKEN_ELEVATION_TYPE.TokenElevationTypeFull;
            }
            finally
            {
                CloseHandle(hToken);
            }
        }
        else
            return true;
    }
}

答案 2 :(得分:0)

您可以使用Windows API LogonUser,然后模拟其他用户以该用户身份运行一段代码。但是有一个限制。启用UAC后,LogonUser将为您提供受限制的用户令牌,这意味着模拟用户(甚至是管理员)永远不会获得比您现有权限更多的权限。此限制不适用于非交互式会话(Windows服务)。

以下是有关如何模拟代码的documentation。此外,您可能会发现this SO question/answer有趣。