【问题标题】:What parts of .NET require administrative privileges to be executed?.NET 的哪些部分需要管理权限才能执行?
【发布时间】:2011-02-06 04:20:03
【问题描述】:

框架的哪些部分要求用户不仅仅是标准用户?我问的原因是因为我正在尝试编制一份我们现有应用程序在迁移到 Windows 7 时可能出现的问题的列表。

现在,我自己能想到几件事:

  • 写入事件日志
  • 写入 Current_User 范围之外的注册表项
  • 获取环境变量
  • 等等……

我真的想要一个更完整的列表,但到目前为止,我还没有找到一个合适的资源来列出所有这些东西。

请注意,我不是在寻找提升现有应用程序权限的方法(这可以通过使用清单来完成),我只是在代码中识别可能导致问题的操作。

【问题讨论】:

  • 顺便说一句,当然这些限制并非特定于.Net
  • 您指定的示例都不需要管理员权限。应用程序可以将自己的日志添加到事件日志系统并指定较低的权限级别。获取环境变量是每个用户的操作。写入 HKCU 之外的注册表项取决于注册表 ACL;应用程序当然可以创建任何用户都可以写入的 HKLM 密钥。
  • 似乎很难获得可能导致问题的 API 调用的完整列表。我将不得不专注于确定应用程序是否会失败的其他方法。现在看来,丹尼尔罗斯似乎为解决我的问题提供了最好的线索,但这并不是我问题的真正答案。由于 Markus 指出该列表与 NT Logo 要求基本相同,因此我将授予他赏金。感谢大家的意见。

标签: .net windows-7 uac


【解决方案1】:

嗯,您的示例与 Windows 7 或 .NET 没有任何关系。实际上,它们已经是“为 Windows NT 4.0 设计”徽标要求的一部分。如果您以非管理员用户能够在 NT、Win2k 或 XP 上运行的方式编写应用程序,那么它在 Vista/Win7 上也能正常运行。

当您在 x64 系统上运行您的软件时,还有另一个常见的陷阱(但这也不是特定于 Win7,而是适用于例如 Win2003 Server x64 或 Win XP x64):如果您使用的是原生 32-位代码,例如调用本机 DLL 或与进程内组件进行 COM 互操作),请确保在 Visual Studio 项目设置中选择“x86”作为平台目标,而不是“任何 CPU”。否则您的应用程序将作为 64 位进程运行,并且您不能在同一进程中混合 32 位和 64 位代码,因此您会遇到错误。

当然,最好使用Environment.GetSpecialFolders,而不是硬编码路径。

【讨论】:

  • 这如何回答这个问题?
  • @Alex - “嗯,您的示例与 Windows 7 或 .NET 没有任何关系”。没有需要管理权限的 .Net 框架部分。有一些框架类,它们封装了可能需要管理员权限的操作系统功能。但是,没有简单的方法来说明特定的 .Net 方法是否会实现这样的功能。
【解决方案2】:

将其视为“库调用什么”会导致您走错路。想想任何写入文件的东西。如果该文件位于 Program Files 下(以及其他位置),则需要管理员权限。如果它在 AppData 下,则不需要。同样的图书馆调用,不同的结果。写入注册表也是如此 - HKLM 你需要管理员,HKCU 你不需要。写入事件日志通常是可以的,但创建事件源不是。等等。这与您调用什么方法无关,而与您传递给它的参数(例如路径)有关。

【讨论】:

    【解决方案3】:

    我不认为获取环境变量需要提升权限。至少我从来没有遇到过,真的有这样的情况吗?

    【讨论】:

    • 你可能是对的。我的方法是首先编制一份可能的痛点列表,然后为每个痛点确定我是否遇到了麻烦。
    【解决方案4】:

    获取部分列表的一个地方是查看“本地组策略编辑器”,您可以在其中检查默认情况下哪些登录权限和特权仅分配给管理员。

    【讨论】:

    • 这是一个有趣的方法。由于 Corp.IT 倾向于过度使用我客户站点上的策略,因此这也可能会带来良好的结果。
    【解决方案5】:

    命名管道可能会导致问题。通常这不是问题,但随着 WCF 原生支持 IPC 传输,命名管道的使用正在增加。

    【讨论】:

    • 谢谢。我也会将其添加到我的列表中。
    【解决方案6】:

    .Net 框架中的任何内容都不需要管理权限。与用户级安全有关的一切都由操作系统控制,是否需要管理员权限是操作系统配置的问题。因此,框架无法确定是否需要提升。

    您不应该考虑“.Net 框架中的哪些内容需要提升?”,而应该考虑“我的应用程序使用的哪些操作系统功能需要在默认配置中进行管理员提升”。正如@Marcus 所说,“专为 Windows NT 4.0 设计”徽标要求是一个很好的起点,可以确定您的应用在设计为作为普通用户运行时应该避免哪些操作系统功能。

    【讨论】:

    • 点了。问题是,如果我可以将其缩小到一组库,就可以扫描(所有)代码库,以找出其中任何一个的出现,这将很快表明可能存在的问题。
    • 我了解您想要实现的目标,但很难自动扫描和标记此类调用。主要是因为管理员提升通常不是由方法调用本身触发,而是由传递给该方法调用的参数触发。
    • 管理员提升根本不是由方法调用触发的。可能触发的是“如果你没有被提升就失败”。这些是不同的。
    【解决方案7】:

    您可以使用来自Application Verifier 的 Luapriv 检查来帮助您发现问题。 Standard User Analyzer 也会帮助你。

    【讨论】:

    • 这些都是很棒的资源。他们肯定会帮助我完成工作。谢谢!
    • 实际上,这些工具是应用程序兼容性工具包的一部分:microsoft.com/downloads/…
    【解决方案8】:

    如果我正确理解您的问题,Visual Studio 可以为您计算...

    只需转到项目的属性,单击安全选项卡并选中“启用 ClickOnce 安全设置”复选框。选择“这是一个部分信任的应用程序”单选按钮,然后单击“计算权限”按钮。

    VS 将在您的应用程序所需的每个权限(如 IO、注册表等)旁边放置一个复选标记...

    【讨论】:

      【解决方案9】:

      我非常怀疑是否有办法获得需要提升权限的 .NET 调用的完整列表。

      顺便说一句,写入事件日志不需要提升,但创建事件日志源确实需要提升。

      找出代码的哪些部分有问题的最佳方法是在 Win7 上进行测试,看看有什么问题,虽然不优雅,但确实有效。如果您希望为此任务创建时间估计,那么您可能需要花一两天时间来破解您的应用程序:在 Win7 上运行,查看中断的地方,记下它,评论/避免/禁用该部分,然后重复直到你认为你有足够多的事情要处理。

      【讨论】:

      • 如果它只是一个我正在检查的应用程序,我同意你的方法会很好。但是,不幸的是,我们谈论的是 250 多个应用程序。而且我想避免不得不一个一个地运行它们。
      • 那么您完全需要 LUA(或标准用户)分析器,它会观察应用程序运行并告诉您它在做什么。确定从其他答案中的链接获取工具包。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-21
      • 2022-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多