我目前只是在一个新进程中调用我自己的程序:
MyProcessStartInfo.Verb = "runas";
MyProcessStartInfo.Arguments = "MyFlag";
当进程开始时,我检查标志。如果它在那里 - 我只是执行该方法并Close();
但如果可以简单地完成,我宁愿做一些更简约的事情。那可能吗?
编辑:使用 Vista 和 Windows7。
我目前只是在一个新进程中调用我自己的程序:
MyProcessStartInfo.Verb = "runas";
MyProcessStartInfo.Arguments = "MyFlag";
当进程开始时,我检查标志。如果它在那里 - 我只是执行该方法并Close();
但如果可以简单地完成,我宁愿做一些更简约的事情。那可能吗?
编辑:使用 Vista 和 Windows7。
您不能提升正在运行的进程。这根本不可能。您正在以正确的方式执行此操作,方法是生成另一个具有更高权限的进程。没有其他办法。
谢谢。但我在想也许有一种方法可以将一种方法作为一个新过程来启动。
您可以创建一个单独的应用程序可执行文件,其中包含您的方法,然后您无需重新启动应用程序。您只需要启动其他进程。
它不是简约的,但您可以使用我从网络上的来源制作的这个属性。其中一些调用是 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;
}
}
您可以使用 Windows API LogonUser
,然后模拟另一个用户以该用户的身份运行一段代码。不过有一个限制。启用 UAC 后,LogonUser
您将获得受限用户令牌,这意味着模拟用户(甚至管理员)永远不会获得比您已经拥有的更多权限。此限制不适用于非交互式会话(Windows 服务)。
这是有关如何在代码中模拟的文档。此外,您可能会发现这个 SO 问题/答案很有趣。