C# .NET中的Windows 7兼容性问题

C# .NET中的Windows 7兼容性问题,c#,C#,在.net中为应用程序创建安装和部署项目时,要安装的应用程序的默认文件夹设置为C:\Program Files….. 如果我们使用的是Windows XP机器,我们的应用程序将运行得非常好。但是如果我们使用的是WindowsVista或Windows7机器,应用程序将无法完美运行,特别是如果我们在应用程序中执行任何文件操作 有人能找到解决这个问题的办法吗?是否有任何方法可以穿透Windows 7的用户帐户控制和文件访问控制?或者,任何人都可以选择将默认安装文件夹从[ProgramFilesFol

在.net中为应用程序创建安装和部署项目时,要安装的应用程序的默认文件夹设置为
C:\Program Files…..
如果我们使用的是Windows XP机器,我们的应用程序将运行得非常好。但是如果我们使用的是WindowsVista或Windows7机器,应用程序将无法完美运行,特别是如果我们在应用程序中执行任何文件操作


有人能找到解决这个问题的办法吗?是否有任何方法可以穿透Windows 7的用户帐户控制和文件访问控制?或者,任何人都可以选择将默认安装文件夹从
[ProgramFilesFolder]\[Manufacturer]\[ProductName]
更改为其他文件夹吗?

如果应用程序写入其安装文件夹下的任何文件(即,如果使用默认路径,则在
程序文件下),则该文件写入错误。你不应该试图绕过操作系统的安全机制来保护用户免受写得不好的应用程序的攻击;你应该修复你的应用程序,让它正常工作


当然,这根本不是一个.NET问题。任何执行相同操作的应用程序,无论使用哪种语言/框架编写,都会有相同的问题。

如果应用程序写入其安装文件夹下的任何文件(即,如果使用默认路径,则写入程序文件下的
),则该应用程序写得不好。你不应该试图绕过操作系统的安全机制来保护用户免受写得不好的应用程序的攻击;你应该修复你的应用程序,让它正常工作


当然,这根本不是一个.NET问题。任何执行相同操作的应用程序,无论使用哪种语言/框架编写,都会遇到相同的问题。

您仍应将应用程序安装在Program Files文件夹中。有很好的理由把它放在那里——一个供所有用户使用的单一副本,在一个众所周知的上锁的地方,只有管理员才能篡改你的二进制文件

但是,您正在执行的任何文件操作都应该位于用户可写文件的标准Windows位置之一。根据文件使用模式,有几个这样的文件夹。您可以在以下问题中了解更多关于这些的信息:



您仍应在Program Files文件夹中安装应用程序。有很好的理由把它放在那里——一个供所有用户使用的单一副本,在一个众所周知的上锁的地方,只有管理员才能篡改你的二进制文件

但是,您正在执行的任何文件操作都应该位于用户可写文件的标准Windows位置之一。根据文件使用模式,有几个这样的文件夹。您可以在以下问题中了解更多关于这些的信息:



所有用户共享的数据应该放在C:\ProgramData中(使用
环境.GetFolderPath(环境.SpecialFolder.CommonApplicationData)
找出它实际所在的位置——在不同的Windows版本之间可能会有所不同)

特定于用户的数据应位于
SpecialFolder.ApplicationData
中。如果用户有漫游配置文件,则在计算机之间共享

特定于用户且特定于机器的数据应位于
SpecialFolder.LocalApplicationData

如果您确实需要将某些内容放入程序的安装目录中,则需要使用管理员权限


您可以在程序第一次运行时提示进行提升。最好是在安装过程中执行此操作(因为您已经升级)。

所有用户共享的数据应放在C:\ProgramData中(使用
Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)
以找出它实际所在的位置--在Windows版本之间可能有所不同)

特定于用户的数据应位于
SpecialFolder.ApplicationData
中。如果用户有漫游配置文件,则在计算机之间共享

特定于用户且特定于机器的数据应位于
SpecialFolder.LocalApplicationData

如果您确实需要将某些内容放入程序的安装目录中,则需要使用管理员权限


您可以在程序第一次运行时提示进行提升。您最好在安装过程中执行此操作(因为您已经升级)。

首先,您不应该将应用程序设置为在C:\Program Files\…下安装,而应该将其设置为%PROGRAMFILES%\。。。虽然这些通常等同于相同的东西,但在64位系统上它们可能不同,或者如果系统设置为那样,它们也可能大不相同

如前所述,不要试图绕过UAC,它存在是有原因的,并且您的程序并不比系统上的任何其他程序更特殊。相反,您应该做的是将应用程序清单设置为在启动时要求管理级别的权限(如果授予该权限,则会绕过文件系统虚拟化,尽管用户可以拒绝该权限,甚至可能没有以管理员身份启动某个应用程序的权限)。您可以做的另一件事是在应用所在的文件夹上设置ACL,并为计算机上的所有用户提供对该文件夹的读/写访问权限(这必须在安装时完成)


或者,您也可以通过正确的方式将数据文件存储在%APPDATA%文件夹中,您对该文件夹拥有完全的权限,尽管这些文件夹特定于系统的每个用户。

首先,您不应将应用程序设置为在C:\Program files\…下安装,而应将其设置为%PROGRAMFILES%\。。。虽然这些通常等同于相同的东西,但在64位系统上它们可能不同,或者如果系统设置为那样,它们也可能大不相同

如前所述,不要试图绕过UAC,它存在是有原因的,你的程序并不比UAC更特别