关于 WPF 项目在 Windows 中权限问题的新思考

关于 WPF 项目在 Windows 中权限问题的新思考

UAC 权限机制

何为 UAC

用户帐户控制(User Account Control,简写作 UAC) 是微软公司在其 Windows Vista 及更高版本操作系统中采用的一种控制机制。其原理是通知用户是否对应用程序使用硬盘驱动器和系统文件授权,以达到帮助阻止恶意程序(有时也称为 “恶意软件”)损坏系统的效果。

UAC 的表现

临床表现

相信大多数人都见过这个窗口,也就是当一个新的 Win10 系统在一开始安装软件时总能见到的一个窗口。

它表示即将运行的程序在向当前 Windows 登录账户申请管理员权限,一旦拥有管理员权限,程序就可以做一些更深入的操作,往往涉及到磁盘的读写、注册表的访问、剪贴板的使用等等


WPF 下对 UAC 不兼容的地方

Drop 事件

不兼容表现

当 A 程序和 B 程序的权限层级不在同一层时,是无法直接从其中一个程序拖动项目到另一个程序的
因为 Drop 事件是通过处理 Window 系统的消息流抓取拖动消息来处理拖动事件的,而(打个比方)不同权限层级的消息流不是同一个流,自然 A 程序就捕获不到 B 程序中的拖动消息

临床表现 : 无法从桌面拖动文件到以管理员权限运行的 WPF 程序中(桌面是由资源管理器(explorer.exe)提供的),因为资源管理器始终以用户权限(User Access)运行

传统解决办法

让用户界面和后台脚本权限分离,以用户权限运行界面,后台脚本则以管理员权限运行
如何实现?百度上有很多教程,可以自行搜索

系统访问

不兼容表现

非管理员权限运行的程序不能:

  1. 访问注册表 (这意味着你不能使用自定义文件格式、不能开机自启动、不能添加软件安装信息…)
  2. 向 C 盘写入文件 (这意味着你不能创建开始菜单捷径、不能在 AppData 文件夹中写入数据、不能固定到任务栏…)
    综上所述,如果你的程序没有管理员权限,那基本就是废的了
传统解决办法

强制使用管理员权限启动;或者在运行过程中通过 WinAPI 请求用户给予管理员权限


新思路

想法由来

一次偶然的偶然,我在使用 System.Diagnostics.Process.Start() 方法启动一个外部程序时,惊奇地发现,即使那个外部程序要求使用管理员权限启动,且我的程序是在用户权限下运行,任然可以启动那个外部程序(登录账户是管理员账户)
于是,一个大胆的念头在我脑海中诞生了:
为什么不把所有需要管理员权限的代码写在一个外部程序中呢

实现

  1. 新建一个 C# 控制台程序,在项目上右键–> 属性–> 应用程序–> 输出类型–> 选择 Windows 应用程序 (这一步保证调用这个程序时不会弹出命令行的窗口)
  2. 将需要管理员权限才能执行的代码写在这个项目中,然后在主程序中添加此项目的引用 (这样这个项目就会生成在主程序目录下)
  3. 接着在主程序需要执行那串代码的地方写:
System.Diagnostics.Process.Start($"{Environment.CurrentDirectory}\\引用项目名称.exe", "参数")
  1. 在引用项目中添加参数处理 例如:
static void Main(string[] args)
{
    string filePath = "";
    if ((args != null) && (args.Length > 0))
    {
        for (int i = 0; i < args.Length; i++)
        {
            // 对于路径中间带空格的会自动分割成多个参数传入
            filePath += " " + args[i];
        }

        filePath.Trim(); //去掉首尾的空格
        if (filePath.Contains("-r")) //如果参数中包含 -r 则执行以下代码
        {
            System.Threading.Thread.Sleep(5 * 1000);
            System.Diagnostics.Process.Start($"{Environment.CurrentDirectory}\\abc.exe");
        }        
    }
}
  1. 在项目上右键–> 属性–> 安全性–> 勾选后又取消勾选 启用ClickOnce安全设置
  2. 项目中 Properties 下新增了一个 app.manifest 文件,双击打开
  3. 找到如下代码段:
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
    <!-- UAC 清单选项
            如果想要更改 Windows 用户帐户控制级别,请使用
            以下节点之一替换 requestedExecutionLevel 节点。n
    <requestedExecutionLevel  level="asInvoker" uiAccess="false" />
    <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />
    <requestedExecutionLevel  level="highestAvailable" uiAccess="false" />

        指定 requestedExecutionLevel 元素将禁用文件和注册表虚拟化。
        如果你的应用程序需要此虚拟化来实现向后兼容性,则删除此
        元素。
    -->
    <requestedExecutionLevel level="asInvoker" uiAccess="false" />
</requestedPrivileges>
  1. requestedExecutionLevel 节点的 level 属性修改为 highestAvailable
  2. 大功告成
  3. 此时,你可以发现,这个外部程序的图标在资源管理器中已经带上了一个小盾牌的标志

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
### 回答1: 这种情况可能是因为你在 WPF 项目使用的某些组件或功能不支持特定的操作系统或软件版本。解决方法可以有以下几种: 1. 确认操作系统和软件版本是否符合要求。如果你的操作系统或软件版本不支持某些组件或功能,尝试升级或更换操作系统或软件版本。 2. 确认你的项目引用了正确的组件。如果你的项目引用了过时或不兼容的组件,尝试更或更换这些组件。 3. 如果你使用了第三方组件或库,查看是否有更或修复程序可用。有时候第三方组件或库存在一些问题,需要更或修复程序才能解决。 4. 如果以上方法都无法解决问题,可以尝试使用其他技术或框架来实现相同的功能。例如,如果你使用 WPF 实现的某个功能在特定操作系统上无法正常工作,可以考虑使用其他框架或技术来实现相同的功能。 ### 回答2: Windows Presentation Foundation (WPF) 是一种用于创建富客户端应用程序的技术。然而,有时在开发WPF项目时,我们可能会遇到不支持某些功能或特性的问题。 举例来说,假设我们想在WPF应用程序使用某个特定的第三方图形库,但是该库并不支持WPF平台。这意味着我们无法直接在WPF项目使用该库提供的功能。 为了解决这个问题,我们可以考虑以下几种方法: 1. 寻找替代方案:我们可以寻找其他WPF平台上可用的图形库。可能会有其他库提供类似的功能,并且与WPF兼容。 2. 自定义开发:如果找不到替代方案,我们也可以自己开发所需功能。WPF提供了强大的自定义开发能力,我们可以使用.NET框架和WPF的图形绘制功能来创建自己的解决方案。 3. 降低要求:有时候我们可能需要降低对某个特定功能的要求,以使其与WPF项目兼容。这可能意味着我们需要减少或改变功能的某些方面,以使其适用于WPF平台。 总之,尽管Windows Presentation Foundation (WPF) 是一种强大的技术,但在某些情况下可能会遇到不支持某些功能或特性的问题。解决这些问题的方法包括寻找替代方案、自定义开发以及降低对特定功能的要求。 ### 回答3: 在Windows Presentation Foundation (WPF) 项目,有时会遇到一些不支持特定功能或操作的情况。出现这种情况可能是由于WPF框架的一些限制或设计决策。 要解决这个问题,首先我们可以尝试寻找替代方案或采用其他方法来实现所需的功能。WPF有许多强大的功能和控件可用于开发各种类型的应用程序,因此很可能可以找到合适的替代。可以尝试使用不同的控件、特性或技术来实现相似的效果。 此外,我们还可以考虑使用第三方库或扩展来增强WPF项目的功能。WPF社区有许多优秀的开发人员和组织提供了各种工具和解决方案,可以帮助我们填补WPF框架的一些功能空白。 另外,我们还可以尝试使用其他技术或平台来实现所需的功能。WPF虽然功能丰富,但并不总是适用于所有情况。可以考虑使用其他技术,例如Windows Forms、HTML5、Javascript等,来实现WPF不支持的功能。 最后,如果以上方法无法解决问题,可能需要重评估项目需求和技术栈选择。有时,某些功能可能无法在WPF项目实现,并且需要考虑使用其他技术或重设计应用程序的功能。 总之,在WPF项目遇到不支持特定功能的情况时,我们可以采取上述措施来尝试解决问题。通过寻找替代方案、使用第三方库或扩展、考虑其他技术或重评估项目需求,我们可以找到解决问题的方法并完成WPF项目的开发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

醉月酿星河

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值