我有一个 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 标准用户下运行的,那么该过程会弹出一个对话框,询问管理员的用户名和密码。只有上面以编程方式启动的进程应该以管理员身份运行,主应用程序本身可以保持为标准用户。