我已经使用应用程序清单配置了我的 .NET 应用程序以请求管理员权限。我还使用 signtool 对程序集进行了签名。一切都很好——当你启动应用程序时,你会收到带有应用程序名称和签名证书名称的漂亮 UAC 提示。
但是,当我从网络共享运行应用程序时,提升提示会显示通用可执行图标,而不是我的应用程序的图标。如何让 UAC 提示显示我的应用程序图标?
我已经使用应用程序清单配置了我的 .NET 应用程序以请求管理员权限。我还使用 signtool 对程序集进行了签名。一切都很好——当你启动应用程序时,你会收到带有应用程序名称和签名证书名称的漂亮 UAC 提示。
但是,当我从网络共享运行应用程序时,提升提示会显示通用可执行图标,而不是我的应用程序的图标。如何让 UAC 提示显示我的应用程序图标?
我大概发现了。
UAC 在服务之上运行,我们看到的对话框在桌面快照之上。该服务只会显示对话框,就好像它在桌面上一样。
正如我们所知,服务在 SYSTEM 帐户上运行(除其他外)。这意味着它需要 SYSTEM 对我们正在启动的可执行文件拥有权限。我只为自己分配了安全性(剥离了 SYSTEM)。
一旦我授予 SYSTEM 权限(只读权限!),并启动应用程序 - 它显示应用程序图标!
是否与以下问题有关:为什么我的 .NET 应用程序从网络驱动器运行时会崩溃?
您的 .net 应用程序在网络共享上拥有除本地磁盘之外的其他权限。更新到 3.5 SP1 通常会消除此问题。否则,请检查 .net 的远程代码策略。
您也可以尝试其他非 .net 应用程序(例如 procmon),该应用程序需要提升才能将其放在同一目录中,看看会发生什么。
显然这不是 .net 的东西,而是 UAC 的东西。
我通过将 systinternals 中的 procmon 放置在网络共享上来重现该行为,并看到了相同的差异。
当切换到使用另一个用户的提升会话时,它可能与此有关。网络映射是在普通用户上完成的,所以在提升的会话中找不到应用程序,因此无法显示图标?
您可以尝试执行以下操作以强制连接在提升的会话中有效:
\\your-network-location\share /user:<username> <password>
\\your-network-location\share\procmon.exe
(为了安全起见,请避免映射驱动器)并查看 UAC 提示是否有所改善?