2

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

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

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

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

编辑:使用 Vista 和 Windows7。

4

3 回答 3

2

您不能提升正在运行的进程。这根本不可能。您正在以正确的方式执行此操作,方法是生成另一个具有更高权限的进程。没有其他办法。

谢谢。但我在想也许有一种方法可以将一种方法作为一个新过程来启动。

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

于 2012-05-14T16:34:54.237 回答
1

它不是简约的,但您可以使用我从网络上的来源制作的这个属性。其中一些调用是 pInvoke 的。所以谷歌'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;
    }
}
于 2012-05-14T16:34:06.833 回答
0

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

这是有关如何在代码中模拟的文档。此外,您可能会发现这个 SO 问题/答案很有趣。

于 2012-05-14T17:34:43.190 回答