我目前只是在一个新流程中调用自己的程序:
MyProcessStartInfo.Verb = "runas";
MyProcessStartInfo.Arguments = "MyFlag";
当过程开始时,我检查标志。如果它在那里 - 我只是执行方法和Close();
但如果可以简单地完成,我宁愿做一些更简约的事情。这可能吗?
编辑:使用Vista和Windows7。
答案 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有趣。