读书人

罗兰德制造无损迁移IIS(含匿名帐号,nt

发布时间: 2012-02-06 15:52:45 作者: rapoo

罗兰德制造无损迁移IIS(含匿名帐号,ntfs,acl,用户同步)
windows下迁移网站确实不如linux下这么方便.
迁移一个两个那是好办.要是迁个虚拟主机.动不动五六百个呢?光是添加用户名密码,绑定域名,配置ntfs权限.每一项都能让人头大.何况要是再来个五六台服务器就三四千了.要是一个一个迁会要命的.

不光是迁移.或者是因为服务器运行久了.慢了,中毒了.本文方法同样适用.要重装系统.

下面这些方法都是尽量用身边最常用的软件,最能就地取材的方法.不借助于第三方,或偏门少见的软件实现.

一.第一步首先搞到你所有用户名和密码.

windows下的密码是搞不到的.存在sam文件中,并且是加密的.开机状态是不可以存取的.破密码的工具也有,可以用lrc,dump一类的工具进行爆破,但是现在我们不是要搞黑客.是自己的服务器.不用这么麻烦.何况就算要黑,跑一个用户的密码也是要跑很久的.
只需要一条命令开始运行打开cmd.exe
net user > c:\userlist.txt
net user最多是三列的会像这样的格式
user1 user2 user3
得到一个所有用户的用户名列表.稍微整理一下,去掉超级管理员,guest等等非网站用户.弄成一列的形式.变成
user1
user2
user3
全选,把它贴到excel中.
这样在A1单元格填的就是user1,选中d1列输入一个数字,拖动填充柄往下拉.会自动自增帮你填好.拉到和用户名一样多就行.
然后在c1列点击fx,等号后输入函数,对d1列的数字进行任意一个tan,sin之类的正,余弦,正,余割都行.会生成一些随机小数位.同样拖动填充柄,往下拉,它会自动帮你填好相对单元格地址引用.

然后,文件,另存为,保存时格式选 CSV(逗号分隔).csv存为userlist.csv
这个文件表现如下
user1,0.3365455
user2,0.5456464
user3,0.2123132

目的就是为了构造

用户名,密码

中间以逗号分隔的列表便于后面调用.这个列表构造方法也很多.不一一例举.上面只是给出其中一种方法.

如果有虚拟管理主机软件如prima,freehost,华众,蓝芒一类.更简单.直接数据库里面导出用户名密码列表即可.

如星外,7i24可以在SQLserver查询分析器执行
select ftpname,ftppassword,serverlistid from FreeHost.FreeHost_Product_Host where serverlistid=1 or serverlistid=2 order by serverlistid

serverlistid可以根据实际受控端来控制是否要一起导出.
在查询分析器右键,另存为即可得到一个userlist.csv的文件.


二.导出IIS配置备份

del iismove.SC0
del iismove.MD0
iisback.vbs /backup /b iismove /e iismove /overwrite /v 0
copy C:\WINDOWS\system32\inetsrv\MetaBack\iismove.SC0 iismove.SC0
copy C:\WINDOWS\system32\inetsrv\MetaBack\iismove.SC0 iismove.MD0

以上是命令行的实现.图形化操作方法也附一个.

iis管理器中最顶级处,右键,所有任务,配置备份、还原

点创建备份,备份名称随便输入,勾选使用密码加密备份,一定要勾,不勾不能在别的电脑还原。


把C:\WINDOWS\system32\inetsrv\MetaBack中生成的MD0和SCO文件复制到新服务器中的
C:\WINDOWS\system32\inetsrv\MetaBack中。

按上面的方法,恢复还原即可。


三.目标服务器IIS预配置

复制前面生成的userlist.csv和批处理文件放同个目录

md d:\freehost
for /f "tokens=2* delims== " %%b in ( 'wmic group where name^= "IIS_WPG " get SID /value^|findstr /i "sid= " ') do (set WPG=%%b)
echo y|cacls.exe d:\freehost /c /s:D:(A;OICI;FA;;;SY)(A;OICI;FA;;;BA)(A;OICI;FR;;;%WPG%)
net localgroup freehost /add
for /f "delims=, tokens=1,2 " %%i in (userlist.CSV) do md d:\freehost\%%i\web
for /f "delims=, tokens=1,2 " %%i in (userlist.CSV) do md d:\freehost\%%i\db
for /f "delims=, tokens=1,2 " %%i in (userlist.CSV) do md d:\freehost\%%i\log
for /f "delims=, tokens=1,2 " %%i in (userlist.CSV) do net user %%i %%j /add /expires:never /passwordchg:no /times:all
for /f "delims=, tokens=1,2 " %%i in (userlist.CSV) do net localgroup freehost /add %%i
for /f "delims=, tokens=1,2 " %%i in (userlist.CSV) do net localgroup users /delete %%i
for /f "delims=, tokens=1,2 " %%i in (userlist.CSV) do setacl.bat %%i



1.上面的命令会自动预建立d:\freehost为网站主目录.并只给iis_wpg组只读权限
(用于运行asp.net,php一类的程序.如果只运行asp.可以省去.)
2.增加freehost用户组,把userlist.csv中的用户建立并加入freehost组.这样做是便于管理.对freehost组进行组策略安全限制即可.
3.预建立用户文件星外的目录结构是
d:\freehost
d:\freehost\web
d:\freehost\log
d:\freehost\db
如果是其他的虚拟主机软件按照规则修改上面的路径即可.
prima是域名点号换下划线生成比如www.baidu.com的文件就是baidu_com
d:\baidu_com
d:\baidu_com\htdoc
d:\baidu_com\database
d:\baidu_com\weblog
文件名不一样,稍作改动即可.

最后一行,是为各目录设置权限
for /f "delims=, tokens=1,2 " %%i in (userlist.CSV) do setacl.bat %%i内容如下


for /f "tokens=2* delims== " %%a in ( 'wmic useraccount where name^= "%1 " get SID /value^|findstr /i "sid= " ') do (set uSID=%%a)
for /f "tokens=2* delims== " %%b in ( 'wmic group where name^= "IIS_WPG " get SID /value^|findstr /i "sid= " ') do (set uWPG=%%b)
echo y|cacls.exe d:\freehost\%1 /c /s:D:AI(A;;FR;;;%uSID%)(A;OICIIO;GR;;;%uSID%)(A;OICIID;FA;;;BA)(A;OICIID;FR;;;%uWPG%)(A;OICIID;FA;;;SY)
echo y|cacls.exe d:\freehost\%1\db /c /t /s:D:AI(D;;SD;;;%uSID%)(A;;0x17019f;;;%uSID%)(A;OICIIO;SDWDGWGR;;;%uSID%)(A;ID;FR;;;%uSID%)(A;OICIIOID;GR;;;%uSID%)(A;OICIID;FA;;;BA)(A;OICIID;FR;;;%uWPG%)(A;OICIID;FA;;;SY)
echo y|cacls.exe d:\freehost\%1\log /c /t /s:D:AI(A;ID;FR;;;%uSID%)(A;OICIIOID;GR;;;%uSID%)(A;OICIID;FA;;;BA)(A;OICIID;FR;;;%uWPG%)(A;OICIID;FA;;;SY)
echo y|cacls.exe d:\freehost\%1\web /c /t /s:D:AI(D;;SD;;;%uSID%)(A;;0x17019f;;;%uSID%)(A;OICIIO;SDWDGWGR;;;%uSID%)(A;ID;FR;;;%uSID%)(A;OICIIOID;GR;;;%uSID%)(A;OICIID;FA;;;BA)(A;OICIID;FR;;;%uWPG%)(A;OICIID;FA;;;SY)


操作的内容是将外部变量用户名传入使用wmic管理命令查出用户名在本机的sid值.因为sid是唯一的(当然用黑客手段也可以让他不唯一,微软bug),即使是两台服务器上相同的用户名,或者在同一台服务器上建立一个用户名删除再建立相同名称的sid也不一样.所以不论重装系统后还是换过服务器都需要用上面批处理重设ntfs权限.

使用的ntfs权限是ace,sddl格式.
因为权限项较多,说起来复杂就不一一说明.大约意思就是将各个用户主目录隔离开,对web目录允许脚本执行,log,db仅能html.防止webshell跨站.


首先到目标服务器上还原iis配置.自然目标服务器上的iis要安装好,如果原服务器有iisftp也需要把ftp安装好

copy /y iismove.SC0 C:\WINDOWS\system32\inetsrv\MetaBack\iismove.SC0
copy /y iismove.MD0 C:\WINDOWS\system32\inetsrv\MetaBack\iismove.MD0
del iismove.SC0
del iismove.MD0
iisback.vbs /restore /b iismove /e iismove /v 0
进行IIS还原.

注意事项:如果有asp.net,isapi_rewrite重写组件,华盾等基于iisfilter的组件,也须要先安装上.不然会因为找不到这些过滤器,会在事件管理器找到大量的错误iis始终是server unavailable.

做到这里,目标IIS差不多已经恢复了,打开html已经正常.
但是运行asp asp.net 一类的程序会被告知401 acl拒绝.因为iis里面的密码没有被同步.

四.最后来做iis匿名访问密码同步.


先导出iis中站点的节点ID编号对照表.

更新W3ID批量表.bat

del c:\sitelisttemp.txt
iisweb/query> c:\sitelisttemp.txt


rem 更新W3ID批量表.bat
for /f "delims=, tokens=1,2 " %%i in (userlist.CSV) do chageuserpass.bat %%i %%j


chageuserpass.bat

net user %1 %2
type c:\sitelisttemp.txt|grep "^%1. "|cut -d "( " -f2|cut -d ") " -f1> c:\W3IDtemp.txt
set /p W3ID= <c:\W3IDtemp.txt
adsutil.vbs set %W3ID%/AnonymousUserName %1
adsutil.vbs set %W3ID%/AnonymousUserPass %2



因为windows下批处理处理字符的功能太弱要嵌套太多for命令.怕大家看得头晕.这里借用了linux两个命令.
grep和cut.去网上找到http://unxutils.sourceforge.net/UnxUtils.zip解压把里面这两个文件复制c:\windows\system32中即可.
假如你实在找不到这两个文件.用windows下for批处理也是可以的.只是略嫌麻烦.


开始运行iisreset /timout:0
对iis进行重启,然后开始
大功告成了.
http://www.reynaldliu.net

[解决办法]
帮顶

读书人网 >应用服务器

热点推荐