windows下用户目录中有个 AppData
目录,该目录下有三个子目录 Local
、LocalLow
、Roaming

在C盘下还有一个 ProgramData
的目录,另外还有 Program Files
、Program Files (x86)
这三个目录

注:上述 AppData
、ProgramData
目录默认是隐藏的,可按以下设置查看

有时候安装程序会让你选一些目录,就会造成困惑,以下是我的一些了解:
为什么有这些目录
一般软件使用过程都分为三个阶段:安装——使用——卸载。这里讨论前两个阶段。
软件安装
Program Files
和 Program Files (x86)
是安装目录。
一般来说,所谓软件安装的过程其实就是压缩包解压的过程,程序员将某个软件打包成一个安装包文件,用户双击该文件就相当于解压这个文件(粗略认为)。解压的目录就是安装路径,解压完成即软件安装完成。
Program Files 和 Program Files (x86) 的区别
windows分为64位和32位的。

现在的家用机基本都是64位的,很少有32位的。但在64位出现之前,早期也都是32位的。所以很多软件都分32位版和64位版。一般来说64位的计算机会向下兼容32位的软件,所以64位机是可以安装32位的软件的。但为了做出一些区分,32位的软件就和64位的软件分两个目录安装了。64位的应安装在 Program Files
下,32位的则应安装在 `Program Files (x86) 下。
软件使用
上述步骤只是完成了软件的安装,软件运行又是另一回事。例如我在电脑上安装好了QQ,下一步就是双击打开并使用它。使用的过程必然伴随着一系列文件的产生,例如聊天记录、缓存文件、用户自定义配置等。从规范上来讲,这些运行过程中生成的文件或配置文件应该都存放在 ProgramData
、AppData
目录下。
ProgramData 和 AppData 的区别
他们俩都是用来存放运行过程中产生的文件和配置,区别在于用户权限的不同。
ProgramData
目录中存放的数据对所有用户共享(一台windows可以创建多个用户使用)。
AppData
目录中存放的数据只对单个用户访问。
例如对QQ而言,我对其外观进行了设置,因为这并不是什么隐私信息,所以可以将其配置存放在 ProgramData
目录中,这样其他用户登录windows后也能看到修改外观的QQ。而对用户的聊天记录则存放在 AppData
目录,毕竟我也不想因为别人使用这台电脑就能看到我的聊天记录。(仅做理解,真实情况不一定是这样)
Local、LocalLow、Roaming 的区别
这三个目录都在 AppData
目录下,基本作用是一样的,就是上面说的为单个用户保存数据。但有一些小的区别:
先说Local和Roaming两个的区别:
如果你的电脑只是你个人使用,那他俩没区别。如果你的电脑是有一个中心化的管理,例如学校的机房、公司的电脑等这种同一台电脑可能有多个用户登录的情况,才有一些区别。
譬如在公司,老板为每个员工创建了一个windows账户,公司有很多windows主机,且位置固定。若有一天你从某个工位换到了另一个工位,但电脑搬不了,你又希望你之前使用的软件信息能同步到新工位的电脑上,你就可以讲软件的数据文件存放在Roaming目录下,当你在其他电脑上登录你的windows账户时,该目录下的所有文件就会自动同步过来。
而对于有些文件,譬如QQ中发送了很多很大的文件,这些文件接收一次后就用不到了,但如果放在Roaming文件夹下同步又很慢。此时你就可以选择放在local文件夹下,该文件夹虽然也是保存程序运行在的私有数据,但它不会根据账号同步。
再说Local和LocalLow的区别
这两个文件夹的作用也是基本相同的,都是保存不用同步的用户数据,区别在于权限的划分(祥见下文 Integrity Level)。
简单来说,存放在 LocalLow
中的文件应该拥有比一般文件更小的权限,这意味着这里面的文件或程序无法对一般的普通文件做修改。若某个病毒放在该文件夹下(并指定为Low级别,见下文 Integrity Level)。则其不能对你的其他一般文件造成破坏。
而存放在Local中的文件和普通的文件拥有同样的权限,这里面的病毒(指定Medium或以上)就能对一般文件造成侵害。
Integrity Level
我们知道windows下的用户是分等级的,譬如管理员用户和普通用户。其实windows在这些用户等级下还有更进一步的权限划分,譬如,对一个普通用户创建的一个文件,又分为六个等级:“Untrusted”、“Low”、“Medium”、“Hight”、“System”、“Installer”。这些等级依次升高,高等级的进程或文件可以操作低等级的进程或文件,反过来则不行。这个等级机制叫做 Integrity Level
普通用户创建的文件或者进程(打开某个程序)一般都是“Medium”级别的,这意味着这些程序可以任意地修改其他“Medium”或更低级别的文件数据,但更高的则不行。这就是为什么有的时候某个程序会提示需要更高等级权限才能操作的原因(这些操作可能需要修改等级为Hight的文件)。

另外,经常在安装软件时会提示,若希望将软件安装到 “Program Files” 目录中,则需要管理员权限也是这个原因,“Program Files”目录就是一个Integrity Level为“High”的目录。
或者对于某个软件,我们可以选择双击直接打开,亦或者选择 右键——>使用管理员权限打开。也是这个道理,使用管理员权限打开就能有更高的执行权限。

查看进程的integrity level可以用官方提供的 process explorer
工具。

注:一开始是没有这一列的,需右键点击任意列表名——>Select column——>勾选Integrity
文件可以使用 icacls
修改和查看(貌似普通文件看不到,下面这个截图是人家的)。还有个貌似叫chml(忘了)

总结
windows的UAC机制很复杂,这也是为什么windows用户总会发出“这明明是我创建的文件,为什么我却删不掉?”等疑问。很有可能原因是该文件的integrity level被设定成了high,而你却使用medium权限去操作,自然是无法操作的。当然,这个机制也只是UAC中的一小部分,还有很多其他的机制会对文件进行保护。
注:
- 上述目录要求并非强制的,例如有些程序就是喜欢将运行过程的数据和配置存放在”Program Files”目录下。
- 上述说将文件置于不同目录下一般不需要用户自己手动操作,而是由该软件开发人员指定,其当然可以在“LocalLow”目录下放更高级别的文件。这些目录只是一个约定,尊不遵守是另一回事。
参考
https://www.youtube.com/watch?v=3XjSTG-oIMw
https://book.hacktricks.xyz/windows-hardening/windows-local-privilege-escalation/integrity-levels
https://docs.microsoft.com/en-us/windows/win32/secauthz/mandatory-integrity-control