【问题标题】:Copy to program files on startup启动时复制到程序文件
【发布时间】:2014-05-12 13:29:00
【问题描述】:

我编写了一个可执行文件,它将文件从网络位置复制到 Program Files 中的文件夹。当我正常运行时(以管理员身份),一切正常。但是,当它作为启动程序运行时,执行会突然停止。

没有抛出异常(据我所知,我已经包含了正常执行时有效的日志记录)。它似乎停止运行;我添加了一个在执行后显示的消息框,但这不起作用。

在代码或设置中是否有任何解决方案可以让我的启动程序写入程序文件?

如果需要,我可以提供代码,但这只是一个简单的file.CopyTo() 方法。确切路径为:C:\Program Files (x86)\Microsoft Visual Studio 11.0\Team Tools\Static Analysis Tools\FxCop\Rules

附加代码:

string sourceLocation = ConfigurationManager.AppSettings["sourceLocationCodeAnalysisRules"];
DirectoryInfo sourceDir = new DirectoryInfo(sourceLocation);
sourceDir
        .GetFiles()
        .Where(file => file.LastWriteTime > new FileInfo(Path.Combine(deployDir.FullName, file.Name)).LastWriteTime)
        .ForEach(file => file.CopyTo(Path.Combine(deployDir.FullName, file.Name), true));
}

此可执行文件的目的是检查网络位置是否有较新的文件,如果它们较新,请将它们复制到给定位置。所以我不需要安装程序。

【问题讨论】:

  • 听起来像是 UAC 问题 - 您应该创建一个 MSI 安装程序(Visual Studio 提供了一个速成版的 Installsheild)
  • 如何将它作为启动程序运行?通过注册表还是将其放入自动启动文件夹?
  • @RowlandShaw:这个的具体用途是什么?有没有办法让我的 .exe 文件直接写入它?
  • @BigM:两种方法我都试过了,都没有成功。
  • 简而言之,UAC 是一种安全措施,可最大程度降低恶意软件将自身复制到看起来“安全”的地方的风险。听起来您正在尝试伪造安装程序,但最好还是实际编写一个安装程序并安装一次。还有其他方法(例如更改文件夹权限),但它们会增加以后出现安全问题的风险,我不建议这样做。

标签: c# windows-8


【解决方案1】:

不要将您的应用程序放在“启动”文件夹中并以管理员身份启动(启动时会出现烦人的 UAC 提示),而是让任务负责执行此操作。

你可以在这里看到如何做:

您可以使用 Windows Installer 确保一切设置正确。

【讨论】:

    【解决方案2】:

    您可能必须以管理员身份运行它。我猜你在All programsWindows 中将程序添加到Startup。在这种情况下,打开启动文件快捷方式的属性并在Compatibility 选项卡中选中“以管理员身份运行此程序”。

    无论如何,如果这不起作用,您应该将日志记录添加到您的应用中以查看会发生什么。

    编辑:或者,您可以使用任务计划程序将任务安排为任务,并使用触发器“计算机启动时”执行。 It seems to work.

    编辑 2:您似乎需要 manifest file 才能复制到程序文件。

    【讨论】:

    • 这个我也试过了,我的程序在改变它的兼容性后不再执行。我是管理员。
    • 然后您应该将日志记录添加到您的应用程序中,看看会发生什么。事件查看器中有什么东西吗?
    • 我已经添加了日志记录,正如您在我的问题中看到的那样。如果我将兼容性设置更改为以管理员身份运行,程序的执行就不会发生。我还检查了事件日志中的线索,但没有发现任何东西。
    • 查看我的编辑:您可以尝试任务计划程序。
    • 这样可以解决管理员问题吗?
    【解决方案3】:

    不以管理员身份运行时,您无法更改 Program Files 文件夹的内容。

    充其量,您必须强制您的应用程序以管理员身份运行,但是每次程序运行时,您都会收到一条 UAC 消息。

    如果这是您想要的,请根据以下答案编辑 app.manifest:How do I force my .NET application to run as administrator?

    【讨论】:

    • 我不想要 UAC 消息,我已经检查过这个功能,这不是想要的性能。
    • 然后不要更改 Program Files 文件夹。即使是普通用户在复制到该文件夹​​时也必须经过此 UAC 消息。
    • 在这种情况下,我必须这样做,该程序旨在将文件从网络位置复制到 Visual Studio 规则位置(代码分析/FxCop)。如果不需要,我不会要求解决方案;)
    • 然后通过比较文件来检查是否真的有必要这样做。然后,您可以尽量减少尝试次数。
    • 如果可能的话,或者在安装时这样做。
    【解决方案4】:

    据我了解,您希望您运行“代码”,用户需要特殊权限才能运行。在这种情况下,我能想到的唯一能帮助您的是您在代码中设置权限限制,这将引发正确的异常,例如:

    [PermissionSetAttribute(SecurityAction.Demand, Name = "FullTrust")]
    

    在您的场景中,它将类似于:

    [FileIOPermissionAttribute(SecurityAction.Demand, Read = "C:\\Program Files")]
    

    你可以在这里找到一个完整的例子和解释:

    How to demand permissions by using Code Access Security.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-10
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多