zoukankan      html  css  js  c++  java
  • [Mklink,Junction,Icacls] 利用批处理生成用户配置文件中的 Junction

    最近新配了台主机,在老板的极力推荐下,上了块 SSD 当系统盘,那速度,果真是一个大四个叉,爽!!!大笑


    上网查了查,发现使用 SSD 还有不少讲究,主要目的是为了延长硬盘的使用寿命,其中有关转移用户配置文件并利用 mklink 命令进行文件夹链接的文章引起了我的兴趣。由于以前 N 次重装系统留下的备份文件实在太乱,而且重复的文件太多,所以准备仔细整理一番,然后用 mklink 将用户文件设置到其它盘去。经过几天的折腾,终于成功将 C:\Users 中的用户文件夹给链接到了 D 盘了,其间发生了各种状况,在此和大家分享下经验和教训。


    折腾之前,先普及下基础知识:

    Windows (Vista/Win7/Win8) 自带的 mklink 命令可以设置文件和文件夹链接,也叫接合点或解析点,可以通过 dir /a:l 进行查看。


    如图中所示,文件或文件夹前具有 <JUNCTION> 标记的,就是接合点。


    Junction:连接点或接合点,图标类似快捷方式,当用户对其进行访问时,读写操作实际上是附加在接点所指向的文件或文件夹上的。

    比如:Win7 中的 "C:\Documents and Settings",用户目录中的 "Application Data"、"My Documents" 等。



    mklink 是用来创建 Junction 的命令,具体使用方法请参考:符号链接Mklink 详解 和 Windows 7 中的 mklink 命令

    好吧,Let's 折腾奋斗

    本文以 Administrator 作为示例用户,要做的就是将用户配置目录 C:\Users\Administrator 链接到 D:\Admin。

    操作共分3个步骤:

    1、用 WinPE 复制 C:\Users\Administrator 文件夹到 D:\Admin 中。

    我的系统是 Win8,曾使用 robocopy 命令来复制用户目录,不幸的是未能成功:

    robocopy "C:\Users\Administrator" "D:\Admin" /copyall /e /xj

    总结下失败的原因:

    a、本打算偷懒,将 Administrator 中的 Junction 一起复制到 D 盘,所以去掉了 /xj 参数。后果是出现了循环复制,原来 Application Data 指向的目录存在循环引用。仔细想想,因为移动了 Administrator 文件夹,原有 Juncation 的目标也就失效了,所以必须添加 /xj 参数。

    b、加上 /xj 参数后,复制成功,但提示有的文件夹无访问权限,不过我没理会。事实证明,这是不对的,因为复制完成后,C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Libraries 无权删除,这还让我怎么建立 Junction 啊~~抓狂

    c、利用系统自带的用户配置文件管理进行复制、删除,也出现了无权访问的状况 委屈

    d、据说安全模式可以搞定,可 Shift+F8 都按陷下去了,也没能进入 Win8 的安全模式,真尼玛丢人啊!发火

    最终我还是选择了 WinPE 环境复制配置文件,而且一次搞定。

    友情提醒:

    Windows 8 OS,建议用 Administrator 帐号登录系统,并点开应用商店逛逛,是否下载应用倒无所谓,否则,折腾完后你会惊喜的发现无法从应用商店中安装应用了!尴尬


    2、重命名 C:\Users\Administrator 和 D:\Administrator 文件夹。

    为了保险起见,C:\Users\Administrator 文件夹不要删除,可以重命名为 Administrator.BAK

    D:\Administrator 重命名为 Admin


    3、利用 mklink 建立文件夹链接:

    mklink /j "C:\Users\Administrator" "D:\Admin"

    注:在 WinPE 中也能使用 mklink 命令,可由于缺少环境变量的设定,所以进入系统目录才能执行。


    4、在 D:\Admin 文件夹中建立如 "Application Data"、"Cookies" 等 Junction 接合点。

    让我们用 dir /s /a:l 命令查看下 Administrator 文件夹中的所有 Juncation:

    由于目录中的 Junction 比较多,而且分散在不同的子目录中,所以我编写了一个批处理来完成这项工作。为了和原用户目录中的 Junction 保持一致,又在批处理中增加了 attrib 和 icacls 命令,作用是分别为这些 Junction 设置系统、隐藏等属性,并添加了拒绝用户访问的权限。


    上脚本咯~~!

    d:
    cd\
    cd Admin
    
    rem mklink
    
    mklink /j "Application Data" "AppData\Roaming"
    mklink /j "Cookies" "AppData\Roaming\Microsoft\Windows\Cookies"
    mklink /j "Local Settings" "AppData\Local"
    mklink /j "My Documents" "Documents"
    mklink /j "NetHood" "AppData\Roaming\Microsoft\Windows\Network Shortcuts"
    mklink /j "PrintHood" "AppData\Roaming\Microsoft\Windows\Printer Shortcuts"
    mklink /j "Recent" "AppData\Roaming\Microsoft\Windows\Recent"
    mklink /j "SendTo" "AppData\Roaming\Microsoft\Windows\SendTo"
    mklink /j "Templates" "AppData\Roaming\Microsoft\Windows\Templates"
    mklink /j "「开始」菜单" "AppData\Roaming\Microsoft\Windows\Start Menu"
    
    mklink /j "AppData\Local\Application Data" "AppData\Local"
    mklink /j "AppData\Local\History" "AppData\Local\Microsoft\Windows\History"
    mklink /j "AppData\Local\Temporary" Internet Files "AppData\Local\Microsoft\Windows\Temporary Internet Files"
    
    mklink /j "AppData\Roaming\Microsoft\Windows\Start Menu\程序" "AppData\Roaming\Microsoft\Windows\Start Menu\Programs"
    
    mklink /j "Documents\My Music" "Music"
    mklink /j "Documents\My Pictures" "Pictures"
    mklink /j "Documents\My Videos" "Videos"
    
    rem attrib
    
    attrib +s +h +i "Application Data"
    attrib +s +h +i "Cookies"
    attrib +s +h +i "Local Settings"
    attrib +s +h +i "My Documents"
    attrib +s +h +i "NetHood"
    attrib +s +h +i "PrintHood"
    attrib +s +h +i "Recent"
    attrib +s +h +i "SendTo"
    attrib +s +h +i "Templates"
    attrib +s +h +i "「开始」菜单"
    
    attrib +s +h +i "AppData\Local\Application Data"
    attrib +s +h +i "AppData\Local\History"
    attrib +s +h +i "AppData\Local\Temporary"
    
    attrib +s +h +i "AppData\Roaming\Microsoft\Windows\Start Menu\程序"
    
    attrib +s +h +i "Documents\My Music"
    attrib +s +h +i "Documents\My Pictures"
    attrib +s +h +i "Documents\My Videos"
    
    rem icacls
    
    icacls "Application Data" /deny Everyone:(S,RD)
    icacls "Cookies" /deny Everyone:(S,RD)
    icacls "Local Settings" /deny Everyone:(S,RD)
    icacls "My Documents" /deny Everyone:(S,RD)
    icacls "NetHood" /deny Everyone:(S,RD)
    icacls "PrintHood" /deny Everyone:(S,RD)
    icacls "Recent" /deny Everyone:(S,RD)
    icacls "SendTo" /deny Everyone:(S,RD)
    icacls "Templates" /deny Everyone:(S,RD)
    icacls "「开始」菜单" /deny Everyone:(S,RD)
    
    icacls "AppData\Local\Application Data" /deny Everyone:(S,RD)
    icacls "AppData\Local\History" /deny Everyone:(S,RD)
    icacls "AppData\Local\Temporary" /deny Everyone:(S,RD)
    
    icacls "AppData\Roaming\Microsoft\Windows\Start Menu\程序" /deny Everyone:(S,RD)
    
    icacls "Documents\My Music" /deny Everyone:(S,RD)
    icacls "Documents\My Pictures" /deny Everyone:(S,RD)
    icacls "Documents\My Videos" /deny Everyone:(S,RD)
    


    将上面的命令行保存为 bat 文件,然后在 cmd 命令行中执行就可以啦~ 希望这个脚本对大家有用处。


    其实,我自己使用的是另一个方法,修改了注册表里

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\[User SID]\ProfileImagePath

    中的值,这个方法弊端比较多,建议大家不要随意使用。





  • 相关阅读:
    jquery Banner 图片自动轮换显示
    JavaScript:appendDiv(append和appendChild的区别)
    JavaScript:addEventListener()和removeEventListener()追加事件和删除追加事件
    Cesium源码之CesiumMath(1.62版)
    cesium功能插件
    JavaScript之prototype
    JavaScript规范define(AMD)
    Cesium之时间
    Cesium CallbackProperty实例
    pku3620 Avoid The Lakes 查找最大连通湖(简单深搜)
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/2999633.html
Copyright © 2011-2022 走看看