当用户保存从我的应用程序的文件,他们目前无法保存受限制的地方(如C :)。 我觉得这是一个很好的限制,但我想提供一个UAC提示提升权限,并允许用户在禁区内保存。
我见过很多围绕这一话题的答案是涉及产生一个新的进程使用“运行方式”提升权限的。 另外,好像这可以通过假冒其他用户来完成。 据我了解,双方的这些方法要求用户提供用户凭据。
就是我想要做的基本上是Windows本身确实是。 当您尝试复制文件到C:\ Windows 7中(假设你有UAC设置为默认级别),你会得到以下提示:
一旦你点击与UAC盾牌继续按钮,将文件复制到C:\无提示凭据(假设你登录使用管理员权限)。
我怎样才能复制在我的管理员用户应用这种行为? 他们不应该模仿任何其他用户,因为他们已经拥有管理员权限。 任何人都可以提供在此过程中有什么Windows正在做细节? 难道他们产卵以高特权新explorer.exe进程?
你需要做的Windows那样。 并产生新的进程,这将使用提升权限运行。 这里没有捷径。 一个进程启动时所分配的令牌是什么决定了权利的过程了。 进程已经启动之后令牌不能被改变。 如果您需要提升,需要一个新的进程。
我见过很多围绕这一话题的答案是涉及产生一个新的进程使用“运行方式”提升权限的。 另外,好像这可以通过假冒其他用户来完成。 据我了解,双方的这些方法要求用户提供用户凭据。
没有事实并非如此。 如果当前用户不是管理员,那么UAC对话框会提示确实有管理员权限的用户的新凭证。 这就是过度的肩 UAC对话框。 在另一方面,如果当前用户是管理员,然后他们只是同意对话框。 这是一个的显示在安全桌面上,只是请求你单击继续对话框。
有一件事是Windows组件可以做到这一点,你不能就是启动不显示你同意对话提升的过程。 这种情况发生在Windows 7只(未Vista系统),只有当你有这是Windows 7中添加了新的默认设置这是浏览器是如何能够证明你在问题中包括对话框中的UAC设置,然后启动提升的过程中做复制,而不显示同意UAC对话框。 只有Windows组件被授予这种能力。
但底线是,你需要开始运行提升一个新的进程。 使用runas
动词是做它的正规途径。
编程提升的特权/ UAC
比需要更多的权限运行的应用程序是违反最小特权原则,并可能有潜在的安全漏洞。 为了保护这一点,Windows Vista中引入了用户帐户控制(UAC),通过运行带有减少权限的应用程序(作为普通用户)保护的操作系统,即使是目前用户以管理员身份登录。 越来越多的XP / 2K用户也可以使用普通用户帐户的日常使用。 阅读UAC揭秘首先要充分了解UAC。
有迹象表明,开发商往往使两个常见的错误:
- 要求最终用户运行具有管理员权限的应用程序,即使这是没有必要的,大多数时候是因为糟糕的设计实践。 这些应用程序或者吓跑最终用户,或可能有安全漏洞。
- 不要求最终用户运行提升的应用程序,但尝试执行需要管理员权限的操作。 这些应用程序只需在Windows Vista或Windows XP / 2K普通用户帐户打破。
可下载的代码示例演示了如何编程提升的权限/ UAC。 WPF和Windows窗体提供了示例应用程序。 运行下面的应用场景看的区别:
- 普通用户的Windows XP / Windows Vista中:显示UAC盾牌图标。 点击“保存到C:\”显示“运行方式”对话框,要求用户输入管理员密码才能继续;
- 管理员时,Windows XP / Windows Vista中的UAC与禁用:UAC的盾牌图标是隐藏的。 点击“保存到C:\”没有任何对话完成;
- 管理员,Windows Vista中启用了UAC:显示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);
}
}
有限的选择,有用只移动,重新命名,复制和删除文件:
SHFileOperation
如果试图通过此功能进行文件操作时,Windows会提供的提升提示给用户。
注意,有一些缺点此:
- 这仅适用于移动,重命名,复制和删除。 保存新文件这样就需要保存到一个临时目录,然后将其移动到所需的位置。 这并不能解决保存文件对话框不允许你选择UAC保护的位置作为目标的问题。
- 如果目标目录不(对于移动或复制)存在,SHFileOperation可以提示用户如果目标目录应该被创建。 但是,它不会要求提升的权限这样做的,等会下UAC保护的位置失败。 这种情况的解决方法是在一个临时位置手动创建不存在的目录,然后移动/将它们复制到目标位置。 这将提供UAC提示。
- 你需要有应急预案到位,如果用户选择“跳过”或“取消”移动/复制对话框,或者如果用户选择“否”,在UAC提示。