【发布时间】:2011-08-13 21:23:10
【问题描述】:
我有一个循环安装其他应用程序的 winforms 应用程序。这在 Windows 7 中的管理员帐户上可以正常工作,但我在标准帐户中存在严重问题 - 应用程序需要提升才能写入“Program Files(x86)”文件夹。
因此,我尝试使用以下代码在 winforms c# 应用程序中请求提升特定方法(运行安装程序的方法):
[System.Security.Permissions.PrincipalPermission(System.Security.Permissions.SecurityAction.Demand, Role = @"BUILTIN\Administrators")]
收到错误后,从网上得知,在调用带有上述属性的方法之前,需要这样写:
AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
我这样做了,方法仍然抛出以下错误:
请求主体权限失败。
逐步调试通过 SetPrincipalPolicy 行,但是,当它到达具有 Demand 属性的方法时,它只是抛出相同的错误,就好像 SetPrincipalPolicy 从未存在过一样。
我在正确设置 Demand 属性时做错了吗?
提前谢谢你。
稍后编辑:这里要求的是在静默安装应用程序时应该触发提升请求的代码(但不起作用):
WindowsPrincipal principal = new WindowsPrincipal(WindowsIdentity.GetCurrent());
bool hasAdministrativeRight = principal.IsInRole(WindowsBuiltInRole.Administrator);
if (!hasAdministrativeRight)
{
ProcessStartInfo psi = new ProcessStartInfo(file);
psi.WindowStyle = ProcessWindowStyle.Hidden;
psi.UseShellExecute = true;
psi.Verb = "runas";
//psi.CreateNoWindow = true;
psi.Arguments = modifiers;
try
{
using (Process process = Process.Start(psi))
{
process.WaitForExit();
if (process.HasExited)
return process.ExitCode;
}
}
catch (Win32Exception wex)
{
}
}
我需要的是,如果应用程序在 Windows 标准用户下运行,该进程会弹出一个对话框,询问管理员的用户名和密码。只有上面以编程方式启动的进程应该以管理员身份运行,主应用程序本身可以保持为标准用户。
【问题讨论】:
-
您需要做一些事情让用户可以输入管理员密码。
-
谢谢 - 你是不是建议我根本不应该使用上面的代码和属性?另外关于您的评论,我已经阅读了有关要求用户名和密码的同意 UI,但无法找到任何地方如何调用它 - 如果您能指出我的链接,我将不胜感激
-
在
process.WaitForExit();之后process.HasExited是否应该始终为真? -
没错,我认为那是多余的。我将删除 HasExited。
标签: c# principalpermission process-elevation