编程提升特权/UAC
以超过要求的权限运行应用程序是违反最小权限原则的,并且可能存在潜在的安全漏洞。为了保护这一点,Windows Vista 引入了用户帐户控制 (UAC),通过以降低的权限(作为普通用户)运行应用程序来保护操作系统,即使当前用户以管理员身份登录。越来越多的 XP/2K 用户也使用普通用户帐户进行日常使用。首先阅读 UAC Demystified 以全面了解 UAC。
开发人员容易犯两个常见错误:
- 请求最终用户以管理员权限运行应用程序,即使这不是必需的,大多数情况下是因为糟糕的设计实践。这些应用程序要么吓跑最终用户,要么可能存在安全漏洞。
- 不要要求最终用户运行提升的应用程序,而是尝试执行需要管理员权限的操作。这些应用程序只是在 Windows Vista 或 Windows XP/2K 普通用户帐户下中断。
可下载的示例代码演示了如何对提升的权限/UAC 进行编程。提供了 WPF 和 Windows 窗体示例应用程序。为以下场景运行应用程序以查看差异:
- 普通用户,Windows XP/Windows Vista:显示 UAC 盾牌图标。点击“Save to C:\”会显示“Run As”对话框,要求用户输入管理员密码才能继续;
- 管理员,禁用 UAC 的 Windows XP/Windows Vista:隐藏 UAC 盾牌图标。点击“Save to C:\”完成,没有任何对话框;
- 管理员,启用 UAC 的 Windows Vista:显示 UAC 盾牌图标。单击“保存到 C:\”会显示对话框,询问用户是否允许继续。
下载链接
调用提升的执行(首先测试管理员):
private void SaveToRootFolder_Click(object sender, EventArgs e)
{
string fileName = @"C:\Test.txt";
if (App.IsAdmin)
DoSaveFile(textBox1.Text, textBox2.Text, fileName);
else
{
NameValueCollection parameters = new NameValueCollection();
parameters.Add("Text1", textBox1.Text);
parameters.Add("Text2", textBox2.Text);
parameters.Add("FileName", fileName);
string result = Program.ElevatedExecute(parameters);
if (!string.IsNullOrEmpty(result))
MessageBox.Show(result);
}
}
提升执行:
internal static string ElevatedExecute(NameValueCollection parameters)
{
string tempFile = Path.GetTempFileName();
File.WriteAllText(tempFile, ConstructQueryString(parameters));
try
{
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.UseShellExecute = true;
startInfo.WorkingDirectory = Environment.CurrentDirectory;
Uri uri = new Uri(Assembly.GetExecutingAssembly().GetName().CodeBase);
startInfo.FileName = uri.LocalPath;
startInfo.Arguments = "\"" + tempFile + "\"";
startInfo.Verb = "runas";
Process p = Process.Start(startInfo);
p.WaitForExit();
return File.ReadAllText(tempFile);
}
catch (Win32Exception exception)
{
return exception.Message;
}
finally
{
File.Delete(tempFile);
}
}