UAC如何知道应用程序将需要提升的权限?

7
我正在维护一个具有约20个支持程序集的C# .NET应用程序。
当它启动时,Windows会显示一个UAC对话框,上面写着:
是否允许以下程序对这台计算机进行更改。 如果我在文件属性对话框中禁用了“以管理员身份运行”复选框,我将得到以下提示:
无法运行[应用程序名称]。用户账户'[我]'没有足够的权限写入
C:\ProgramData[公司][应用程序名称]
此应用程序将尝试写入ProgramData目录,这导致UAC要求用户授权。
UAC如何知道应用程序将要写入ProgramData?
我该如何更改才能使UAC不再提醒?

有几个SO问题涵盖了这个特定的主题。它们中的任何一个解决了你的问题吗?至于UAC没有抱怨 - 你有两个选择 - 1.你需要点击过去,或者2.你需要禁用UAC。UAC是为了用户的保护而存在的(无论多么烦人:\)。 - ddavison
你尝试过不写C:\ProgramData[Company][Application Name]吗? - Dennis
应用程序将许多文件存储到ProgramData中,这些文件与所有用户共享。也许有更好的地方来存放共享数据。 - Robert Deml
@sircapsalot - 我想知道我做了什么导致Windows担心我的应用程序可能会做一些潜在的危险行为。目标是允许用户正确运行UAC并让应用程序正确运行。 - Robert Deml
1
Windows中没有表达这个要求的机制,这必须在应用程序中进行编程。找到该代码的一种方法是使用调试器,并在显示对话框时使用“调试+中断所有”。查看主线程的调用堆栈。 - Hans Passant
2个回答

4
  1. UAC是如何知道应用程序将写入ProgramData的?

    • 在UAC架构的虚拟化过程中,“Protected Directories”列表中可能包含ProgramData。(需要来源证实) enter image description here
  2. 我能改变什么让UAC不再抱怨?

    • 有几个选择 -
      1. 看起来你正在尝试写入C:\ProgramData[Company][Product]
        对我来说,这似乎是一个路径分隔问题。你正在尝试创建(或使用)名为C:\ProgramDataAdobePhotoshop的目录 如果你的应用程序没有分隔这些目录,那么我认为这会导致UAC出现问题。尝试添加路径分隔符号。C:\ProgramData\Adobe\Photoshop [例如]
      2. 禁用UAC? UAC是用来防止未经授权的活动的,如果你查看上面的流程图,任何具有写入“受限目录”或任何“提升的操作”的签名的应用程序都将落入其中,并引发UAC提示。你的用户将通过它,一切都很好。
      3. 使用Application Data文件夹,而不是ProgramData文件夹。该文件夹似乎被隐藏有其原因。

我的建议 - 对于任何需要存储数据的应用程序 - 使用用户的Application Data而不是ProgramData文件夹。如果使用此目录,则不会收到任何UAC提示。(这个问题可能会对此有所帮助)


0

这个应用程序可能有一个类似于这样的清单文件:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
        <security>
            <requestedPrivileges>
                <requestedExecutionLevel level="requireAdministator" uiAccess="false"/>
            </requestedPrivileges>
        </security>
    </trustInfo>
</assembly>   

如果设置了requestedExecutionLevel level="requireAdministator",程序将会弹出UAC对话框。
通常情况下,清单文件应该被命名为app.manifest

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接