MMC不能打开文件c:windowssystem32compmgmt.msc
[ 2010/12/08 09:22 | by selboo ]
文件msxml3.dll 没有注册 解决办法:
开始 运行一下regsvr32 C:\Windows\system32\msxml3.dll
问:打不开WinXP里的“设备管理器”及“计算机管理”等,单击后就出现“MMC不能打开文件C:\system32/devmgmt.msc,这可能是由于文件不存在……也可能是由于您没有访问此文件的足够权限”。电脑知识网推荐
答:试试看下面的方法吧,不知道是否可行:
1. 重新从Windows CD中解压devmgmt.msc和devmgmt.dll,命令如下:
expand cdrom:\i386\devmgmt.ms_ %systemroot%\system32\devmgmt.msc
expand cdrom:\i386\devmgr.dl_ %systemroot%\system32\devmgr.dll
2.重新注册一下msxml par
开始 运行一下regsvr32 C:\Windows\system32\msxml3.dll
问:打不开WinXP里的“设备管理器”及“计算机管理”等,单击后就出现“MMC不能打开文件C:\system32/devmgmt.msc,这可能是由于文件不存在……也可能是由于您没有访问此文件的足够权限”。电脑知识网推荐
答:试试看下面的方法吧,不知道是否可行:
1. 重新从Windows CD中解压devmgmt.msc和devmgmt.dll,命令如下:
expand cdrom:\i386\devmgmt.ms_ %systemroot%\system32\devmgmt.msc
expand cdrom:\i386\devmgr.dl_ %systemroot%\system32\devmgr.dll
2.重新注册一下msxml par
PHP版iis日志分析程序
[ 2009/06/10 01:36 | by selboo ]
<?php
/*******************************************************
*功能:iis日志分析,分析出访问IP总数,搜索引擎抓取次数
*说明:
* 将日志文件放在网站根目录,并改名为log.log。
*演示:http://www.zhanzhangpu.com/tools/iislog/
* http://www.zhanzhangpu.com/tools/iislog/demo.gif
*作者:blackli,来自落伍者
*问题:搜索引擎蜘蛛地址不准确,尤其是google蜘蛛地址,国内流行的地址列
* 表存在相当大的误差,能力有限,不能够解决这个问题。有兴趣的可以参考
* 下面的网址.
*参考:http://www.seonewthing.com/googleBotCheck.aspx
* http://googlewebmastercentral.blogspot.com/2006/09/how-to-verify-googlebot.html
*******************************************************/
//打开日志文件
$DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT'];
$fp = fopen("$DOCUMENT_ROOT/log.log",'rb');
if ( !$fp )
{
echo '打开文件失败';
exit;
}
//分析每行日志
$num_ip = 0; //访问IP总数
$ip = array(); //IP数据数组,其中ip[$i][0]为IP地址、ip[$i][1]为该地址出现次数
while ( !feof($fp) )
{
$line = fgets($fp,1001);
if ( substr($line,0,1) == '#' )
{
//获取日志生成时间
if ( substr($line,0,5) == '#Date' )
{
$date_info = explode(' ',$line);
//echo '日志生成时间:'.$date_info[1].' '.$date_info[2].'</br>';
}
}
else
{
//获取访问IP
if ( $line == '' ) continue;
$ip_info = explode(' ',$line);
for ( $j = $num_ip-1, $having_ip = false; $j >= 0 ; $j -- )
{
if ( $ip[$j][0] == $ip_info[6] )
{
$having_ip = true;
$ip[$j][1] ++ ;
break;
}
}
if ( $having_ip == false )
{
$ip[$num_ip][0] = $ip_info[6];
$ip[$num_ip][1] = 1;
$num_ip ++;
}
}
}
//获取搜索引擎蜘蛛访问次数
//baidu、google蜘蛛地址列表
$baiduSpider = array('220.181','159.226','202.108','61.135.');
$googleBot = array('74.125.','209.85.','66.102.','64.233.','64.249','209.85.');
$num_Spider = $num_googleBot = 0;
for ( $i = 0; $i < $num_ip ; $i++ )
{
//计算百度蜘蛛访问次数
for ( $j = 0 ; $j < 4 ; $j ++ )
{
if ( substr($ip[$i][0],0,7) == $baiduSpider[$j] )
{
$num_Spider += $ip[$i][1];
continue;
}
}
//计算google蜘蛛访问次数
for ( $j = 0 ; $j < 6 ; $j ++ )
{
if ( substr($ip[$i][0],0,7) == $googleBot[$j] )
{
$num_googleBot += $ip[$i][1];
continue;
}
}
}
//echo '百度蜘蛛请求'.$num_Spider.'次
';
//echo 'google蜘蛛请求'.$num_googleBot.'次
';
fclose($fp);
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>iis日志分析-Powered by ZhanZhangPu</title>
<style type="text/css">
#main{
width:800px;
margin:0 auto;
border:1px solid #EEE;
}
#main div{
background:#EEE;
border:2px solid #FBFBFB;
line-height:25px;
font-size:15px;
padding:15px;
}
</style>
</head>
<body >
<div id="main">
<h2>日志生成时间<?php echo $date_info[1].' '.$date_info[2]; ?></h2>
<div>
共有<?php echo $num_ip; ?>IP的请求.
百度蜘蛛请求<?php echo $num_Spider; ?>次.
google蜘蛛请求<?php echo $num_googleBot; ?>次.
</div>
<div>
IP地址列表:
<?php
for ( $i = 0 ; $i < $num_ip ; $i ++ )
{
echo $ip[$i][0].' '.$ip[$i][1].'次.
';
}
?>
</div>
<div>Powered by <a href="http://www.zhanzhangpu.com">站长铺</a>™</div>
</div>
</body>
</html>
/*******************************************************
*功能:iis日志分析,分析出访问IP总数,搜索引擎抓取次数
*说明:
* 将日志文件放在网站根目录,并改名为log.log。
*演示:http://www.zhanzhangpu.com/tools/iislog/
* http://www.zhanzhangpu.com/tools/iislog/demo.gif
*作者:blackli,来自落伍者
*问题:搜索引擎蜘蛛地址不准确,尤其是google蜘蛛地址,国内流行的地址列
* 表存在相当大的误差,能力有限,不能够解决这个问题。有兴趣的可以参考
* 下面的网址.
*参考:http://www.seonewthing.com/googleBotCheck.aspx
* http://googlewebmastercentral.blogspot.com/2006/09/how-to-verify-googlebot.html
*******************************************************/
//打开日志文件
$DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT'];
$fp = fopen("$DOCUMENT_ROOT/log.log",'rb');
if ( !$fp )
{
echo '打开文件失败';
exit;
}
//分析每行日志
$num_ip = 0; //访问IP总数
$ip = array(); //IP数据数组,其中ip[$i][0]为IP地址、ip[$i][1]为该地址出现次数
while ( !feof($fp) )
{
$line = fgets($fp,1001);
if ( substr($line,0,1) == '#' )
{
//获取日志生成时间
if ( substr($line,0,5) == '#Date' )
{
$date_info = explode(' ',$line);
//echo '日志生成时间:'.$date_info[1].' '.$date_info[2].'</br>';
}
}
else
{
//获取访问IP
if ( $line == '' ) continue;
$ip_info = explode(' ',$line);
for ( $j = $num_ip-1, $having_ip = false; $j >= 0 ; $j -- )
{
if ( $ip[$j][0] == $ip_info[6] )
{
$having_ip = true;
$ip[$j][1] ++ ;
break;
}
}
if ( $having_ip == false )
{
$ip[$num_ip][0] = $ip_info[6];
$ip[$num_ip][1] = 1;
$num_ip ++;
}
}
}
//获取搜索引擎蜘蛛访问次数
//baidu、google蜘蛛地址列表
$baiduSpider = array('220.181','159.226','202.108','61.135.');
$googleBot = array('74.125.','209.85.','66.102.','64.233.','64.249','209.85.');
$num_Spider = $num_googleBot = 0;
for ( $i = 0; $i < $num_ip ; $i++ )
{
//计算百度蜘蛛访问次数
for ( $j = 0 ; $j < 4 ; $j ++ )
{
if ( substr($ip[$i][0],0,7) == $baiduSpider[$j] )
{
$num_Spider += $ip[$i][1];
continue;
}
}
//计算google蜘蛛访问次数
for ( $j = 0 ; $j < 6 ; $j ++ )
{
if ( substr($ip[$i][0],0,7) == $googleBot[$j] )
{
$num_googleBot += $ip[$i][1];
continue;
}
}
}
//echo '百度蜘蛛请求'.$num_Spider.'次
';
//echo 'google蜘蛛请求'.$num_googleBot.'次
';
fclose($fp);
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>iis日志分析-Powered by ZhanZhangPu</title>
<style type="text/css">
#main{
width:800px;
margin:0 auto;
border:1px solid #EEE;
}
#main div{
background:#EEE;
border:2px solid #FBFBFB;
line-height:25px;
font-size:15px;
padding:15px;
}
</style>
</head>
<body >
<div id="main">
<h2>日志生成时间<?php echo $date_info[1].' '.$date_info[2]; ?></h2>
<div>
共有<?php echo $num_ip; ?>IP的请求.
百度蜘蛛请求<?php echo $num_Spider; ?>次.
google蜘蛛请求<?php echo $num_googleBot; ?>次.
</div>
<div>
IP地址列表:
<?php
for ( $i = 0 ; $i < $num_ip ; $i ++ )
{
echo $ip[$i][0].' '.$ip[$i][1].'次.
';
}
?>
</div>
<div>Powered by <a href="http://www.zhanzhangpu.com">站长铺</a>™</div>
</div>
</body>
</html>
IIS日志清理(CMD版,VBS版,JS版,WSH版)
[ 2009/03/02 13:26 | by selboo ]
来源:柳永法(yongfa365)'Blog
专题名称:IIS日志清理专题,CMD版,VBS版,JS版,WSH版
关键词:IIS日志清理,日志清理,IIS日志清理CMD版,IIS日志清理VBS版,IIS日志清理JS版,IIS日志清理WSH版
应用场合:主要用与虚拟主机,也可用于个人服务器
产生背景:2005 年某月某日,一向运行正常的虚拟主机死机了,让机房值班人员重启数次,都不成,接显示器进系统看,提示:C盘空间不足,半夜还得去机房处理,到机房后先断网,再进系统发现有两个地方有问题,C:\WINDOWS\system32\LogFiles文件有6G,还有一个就是Symantec隔离病毒的地方,到网上找了下,最大可能性是我们的虚拟主机的所有日志都写在这里,并且没人知道写在这里,郁闷,在IIS里看了下,还真是这么回事,日志天天都在长,当时公司订单很多也没人关注这个,当时清理了一下,系统正常,回到公司后把IIS日志改到别的盘了。
解决方案:不过这不是最终解决方法呀,一个虚拟主机几百个站点呢,有的站点一天就能产生几百M的日志文件,还得及时清理。
与是有了两种解决方案:
1.每天清理前60天的日志
2.过段时间清理一下60天前的日志。
不过哪种方法都得采用技术处理,人工去删除 的话除非你很专业,可以查找60天前的日志文件来删除,不过即便你技术很好,这种方法也是很费时的,最好的方法是:使用DOS批处理或脚本来实现,可使用到的脚本主要是vbs与js.
在下边的解决方案里有几种方法大家可以选择适合自己的,他们的总的设计思路是这样的:
IIS日志文件的格式是:ex年月日.log 比如:ex071116.log
IIS日志文件存储位置:默认情况下是在:%windir%\system32\LogFiles ,如果您使用的是专业的IIS管理软件,里面一般会让你设置相应日志目录
IIS日志清理CMD版:跟据当前时间计算出前N天的日期,比如今天是:2007-11-16,前60天的日期就是2007-9-16(程序可以自动识别30天或31天或润月),然后再处理成20070916这样的格式,然后再组合成ex070916.log这样的IIS日志文件格式,这样一来我们就得到的要清理的日志文件名然后,我们再使用del /s /f d:\iislog\ex070916.log 来清除日志所在文件夹目录及子目录下的所有这个文件名的文件了,从而清除志,但这个仅仅是清除一天的日志,所以我们还得把这个批处理加到计划任务里,让它每天定时执行,这样一来,所有的计算机的日志问题我们就可以不用管了。
IIS日志清理VBS版:VBS版理论是没有iis版快,因为他还要借助脚本驱动,而不像cmd版直接使用dos系统的批处理功能快(猜的),VBS毕竟是高级语言,处理日期的能力用一句话就实现了,而CMD版得写半页。IIS日志清理VBS版的实现用VBS遍历IIS日志所在目录下的所有文件,及文件夹,然后取文件名组合成日期型的,然后当前日期-这个日期,看看是不是超过了设定的天数,超过的话delete,这种思路有个好处就是一次可以清除N天前的所有记录,而不是只是一天的,他可以你CMD版日志清理一样,把这个脚本写到计划任务里,天天运行,也可以过一段时间手动运行一次。这个代码明显比IIS日志清理CMD版少了。
IIS日志清理JS版:这个版其实与IIS日志清理VBS版差不了多少,思路都是一样的,只是使用的脚本语言不一样而已,还有就是调用时的两个参数里的每一个参数:目录,这个目录得写成:D:\\iislog,以前都用vbs还当主要脚本,这次主要是要学C#了,听说这两种语言都差不多,正好也练习下,也没花多少时间。
IIS日志清理WSH版:WSH版其实是最简单的,因为他的集成化程度很高,操作过程是这样的:使用vbs或js生成要处理的文件的文件名,然后再使用WScript.Shell执行cmd命令来处理,利用了IIS日志清理CMD版及IIS日志清理VBS版的优点,这个也是一次只能处理一天的日志,当然您也可以把它改成处理多天的日志。正因为WSH集成化程度高,可以执行很多操作,所以黑客们都很喜欢这个,用的最多的也就是WScript.Shell,所以一般安全意识比较高的服务器提供商都会把这个组件给禁用掉,这样一来,这个最好用的功能就变成了最不能使用的,通用性最差的了。
实例代码:
IIS日志清理CMD版代码(DelIISLog.cmd):
IIS日志清理VBS版代码(DelIISLog.vbs):
IIS日志清理JS版代码(DelIISLog.js):
IIS日志清理WSH版代码(DelIISLog.wsf):
有时我拿到别人的代码时我得写一堆东西来测试,现在这个如果让您去测试的话,您不会直接在服务器上测试吧,所以,以下再贴出本人柳永法的测试脚本,主要是在D盘生成一个测试文件夹,及一些IIS测试日志文件,
IIS日志清理之IIS日志生成系统(CreateIISLog.vbs):
后记:这个方法不仅可以用在IIS日志处理方面,还可以用在处理Serv-U的日志处理,前提条件是Serv-U的日志文件的格式也得设成像IIS日志这样的格式ex071115.log。
专题名称:IIS日志清理专题,CMD版,VBS版,JS版,WSH版
关键词:IIS日志清理,日志清理,IIS日志清理CMD版,IIS日志清理VBS版,IIS日志清理JS版,IIS日志清理WSH版
应用场合:主要用与虚拟主机,也可用于个人服务器
产生背景:2005 年某月某日,一向运行正常的虚拟主机死机了,让机房值班人员重启数次,都不成,接显示器进系统看,提示:C盘空间不足,半夜还得去机房处理,到机房后先断网,再进系统发现有两个地方有问题,C:\WINDOWS\system32\LogFiles文件有6G,还有一个就是Symantec隔离病毒的地方,到网上找了下,最大可能性是我们的虚拟主机的所有日志都写在这里,并且没人知道写在这里,郁闷,在IIS里看了下,还真是这么回事,日志天天都在长,当时公司订单很多也没人关注这个,当时清理了一下,系统正常,回到公司后把IIS日志改到别的盘了。
解决方案:不过这不是最终解决方法呀,一个虚拟主机几百个站点呢,有的站点一天就能产生几百M的日志文件,还得及时清理。
与是有了两种解决方案:
1.每天清理前60天的日志
2.过段时间清理一下60天前的日志。
不过哪种方法都得采用技术处理,人工去删除 的话除非你很专业,可以查找60天前的日志文件来删除,不过即便你技术很好,这种方法也是很费时的,最好的方法是:使用DOS批处理或脚本来实现,可使用到的脚本主要是vbs与js.
在下边的解决方案里有几种方法大家可以选择适合自己的,他们的总的设计思路是这样的:
IIS日志文件的格式是:ex年月日.log 比如:ex071116.log
IIS日志文件存储位置:默认情况下是在:%windir%\system32\LogFiles ,如果您使用的是专业的IIS管理软件,里面一般会让你设置相应日志目录
IIS日志清理CMD版:跟据当前时间计算出前N天的日期,比如今天是:2007-11-16,前60天的日期就是2007-9-16(程序可以自动识别30天或31天或润月),然后再处理成20070916这样的格式,然后再组合成ex070916.log这样的IIS日志文件格式,这样一来我们就得到的要清理的日志文件名然后,我们再使用del /s /f d:\iislog\ex070916.log 来清除日志所在文件夹目录及子目录下的所有这个文件名的文件了,从而清除志,但这个仅仅是清除一天的日志,所以我们还得把这个批处理加到计划任务里,让它每天定时执行,这样一来,所有的计算机的日志问题我们就可以不用管了。
IIS日志清理VBS版:VBS版理论是没有iis版快,因为他还要借助脚本驱动,而不像cmd版直接使用dos系统的批处理功能快(猜的),VBS毕竟是高级语言,处理日期的能力用一句话就实现了,而CMD版得写半页。IIS日志清理VBS版的实现用VBS遍历IIS日志所在目录下的所有文件,及文件夹,然后取文件名组合成日期型的,然后当前日期-这个日期,看看是不是超过了设定的天数,超过的话delete,这种思路有个好处就是一次可以清除N天前的所有记录,而不是只是一天的,他可以你CMD版日志清理一样,把这个脚本写到计划任务里,天天运行,也可以过一段时间手动运行一次。这个代码明显比IIS日志清理CMD版少了。
IIS日志清理JS版:这个版其实与IIS日志清理VBS版差不了多少,思路都是一样的,只是使用的脚本语言不一样而已,还有就是调用时的两个参数里的每一个参数:目录,这个目录得写成:D:\\iislog,以前都用vbs还当主要脚本,这次主要是要学C#了,听说这两种语言都差不多,正好也练习下,也没花多少时间。
IIS日志清理WSH版:WSH版其实是最简单的,因为他的集成化程度很高,操作过程是这样的:使用vbs或js生成要处理的文件的文件名,然后再使用WScript.Shell执行cmd命令来处理,利用了IIS日志清理CMD版及IIS日志清理VBS版的优点,这个也是一次只能处理一天的日志,当然您也可以把它改成处理多天的日志。正因为WSH集成化程度高,可以执行很多操作,所以黑客们都很喜欢这个,用的最多的也就是WScript.Shell,所以一般安全意识比较高的服务器提供商都会把这个组件给禁用掉,这样一来,这个最好用的功能就变成了最不能使用的,通用性最差的了。
实例代码:
IIS日志清理CMD版代码(DelIISLog.cmd):
@echo off
title Made by www.yongfa365.com
::设置当前日期前多少天或后多少天
set/a beforedays=-3
::设置目录所在位置
set dir="F:\log\"
::当前日期转换为天数并进行计算
call :Date2Day %date:~0,10% days
set/a days=%days%%beforedays%
call :Day2Date %days% lastdate
::计算完毕,生成想要的字符组合
set okstr=ex%lastdate:~2,6%.log
::删除这些文件
del del /f /s /q %dir%\%okstr%
cmd /k
:Date2Day
setlocal ENABLEEXTENSIONS
for /f "tokens=1-3 delims=/-, " %%a in ('echo/%1') do (
set yy=%%a & set mm=%%b & set dd=%%c
)
set /a dd=100%dd%%%100,mm=100%mm%%%100
set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,j=153*m+2
set /a j=j/5+dd+y*365+y/4-y/100+y/400-2472633
endlocal&set %2=%j%&goto :EOF
:Day2Date
setlocal ENABLEEXTENSIONS
set /a i=%1,a=i+2472632,b=4*a+3,b/=146097,c=-b*146097,c/=4,c+=a
set /a d=4*c+3,d/=1461,e=-1461*d,e/=4,e+=c,m=5*e+2,m/=153,dd=153*m+2,dd/=5
set /a dd=-dd+e+1,mm=-m/10,mm*=12,mm+=m+3,yy=b*100+d-4800+m/10
(if %mm% LSS 10 set mm=0%mm%)&(if %dd% LSS 10 set dd=0%dd%)
endlocal&set %2=%yy%%mm%%dd%&goto :EOF
title Made by www.yongfa365.com
::设置当前日期前多少天或后多少天
set/a beforedays=-3
::设置目录所在位置
set dir="F:\log\"
::当前日期转换为天数并进行计算
call :Date2Day %date:~0,10% days
set/a days=%days%%beforedays%
call :Day2Date %days% lastdate
::计算完毕,生成想要的字符组合
set okstr=ex%lastdate:~2,6%.log
::删除这些文件
del del /f /s /q %dir%\%okstr%
cmd /k
:Date2Day
setlocal ENABLEEXTENSIONS
for /f "tokens=1-3 delims=/-, " %%a in ('echo/%1') do (
set yy=%%a & set mm=%%b & set dd=%%c
)
set /a dd=100%dd%%%100,mm=100%mm%%%100
set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,j=153*m+2
set /a j=j/5+dd+y*365+y/4-y/100+y/400-2472633
endlocal&set %2=%j%&goto :EOF
:Day2Date
setlocal ENABLEEXTENSIONS
set /a i=%1,a=i+2472632,b=4*a+3,b/=146097,c=-b*146097,c/=4,c+=a
set /a d=4*c+3,d/=1461,e=-1461*d,e/=4,e+=c,m=5*e+2,m/=153,dd=153*m+2,dd/=5
set /a dd=-dd+e+1,mm=-m/10,mm*=12,mm+=m+3,yy=b*100+d-4800+m/10
(if %mm% LSS 10 set mm=0%mm%)&(if %dd% LSS 10 set dd=0%dd%)
endlocal&set %2=%yy%%mm%%dd%&goto :EOF
IIS日志清理VBS版代码(DelIISLog.vbs):
'IIS日志清理VBS版代码(DelIISLog.vbs) Made by www.yongfa365.com
'调用方法:DelIISLog "IIS日志所在路径",保留多少天的IIS日志
'遍历IIS日志文件夹下的所有文件及子文件夹下的文件
Function DelIISLog(IISLogPath,KeepDays)
on error resume next
Set oFso = CreateObject("Scripting.FileSystemObject")
Set oFolder = oFso.GetFolder(IISLogPath)
Set oSubFolders = oFolder.SubFolders '得到该目录下所有的文件夹的集合
Set oFiles = oFolder.Files '得到该目录下所有的文件的集合
'第一步处理当前目录下的所有文件
For Each oFile In oFiles '遍历所有文件
if right(oFile.name,3)="log" then
oDate=cdate("20" & mid(oFile.name,3,2) & "-" & mid(oFile.name,5,2) & "-" & mid(oFile.name,7,2))
if date-oDate > KeepDays then oFile.delete '判断是不是要处理的IIS日志文件,如果是的话直接删除
end if
Next
'第二步处理当前目录下的所有目录,进行递归调用
For Each oSubFolder In oSubFolders
DelIISLog oSubFolder.Path,KeepDays '递归
Next
End Function
DelIISLog "D:\IISLogTest",20 '遍历
'调用方法:DelIISLog "IIS日志所在路径",保留多少天的IIS日志
'遍历IIS日志文件夹下的所有文件及子文件夹下的文件
Function DelIISLog(IISLogPath,KeepDays)
on error resume next
Set oFso = CreateObject("Scripting.FileSystemObject")
Set oFolder = oFso.GetFolder(IISLogPath)
Set oSubFolders = oFolder.SubFolders '得到该目录下所有的文件夹的集合
Set oFiles = oFolder.Files '得到该目录下所有的文件的集合
'第一步处理当前目录下的所有文件
For Each oFile In oFiles '遍历所有文件
if right(oFile.name,3)="log" then
oDate=cdate("20" & mid(oFile.name,3,2) & "-" & mid(oFile.name,5,2) & "-" & mid(oFile.name,7,2))
if date-oDate > KeepDays then oFile.delete '判断是不是要处理的IIS日志文件,如果是的话直接删除
end if
Next
'第二步处理当前目录下的所有目录,进行递归调用
For Each oSubFolder In oSubFolders
DelIISLog oSubFolder.Path,KeepDays '递归
Next
End Function
DelIISLog "D:\IISLogTest",20 '遍历
IIS日志清理JS版代码(DelIISLog.js):
//IIS日志清理JS版代码(DelIISLog.js) Made by www.yongfa365.com
//调用方法:DelIISLog("IIS日志所在路径",保留多少天的IIS日志);
//遍历IIS日志文件夹下的所有文件及子文件夹下的文件
function DelIISLog(IISLogPath,KeepDays){
var fso = new ActiveXObject("Scripting.FileSystemObject");
var f = fso.GetFolder(IISLogPath);
var Folders = new Enumerator(f.SubFolders); //得到该目录下所有的文件夹的集合
var Files = new Enumerator(f.Files); //得到该目录下所有的文件的集合
//第一步处理当前目录下的所有文件
for (; !Files.atEnd(); Files.moveNext()) {
var fileName = Files.item().name;
var year = "20" + fileName.substr(2, 2);
var mouth = fileName.substr(4, 2);
var day = fileName.substr(6, 2);
var days = Math.round(((new Date()).getTime() - Date.UTC(year, mouth - 1, day)) / 1000 / 60 / 60 / 24);
if (days > KeepDays) Files.item().Delete(); //判断是不是要处理的IIS日志文件,如果是的话直接删除
}
//第二步处理当前目录下的所有目录,进行递归调用
for (; !Folders.atEnd(); Folders.moveNext()) {
DelIISLog(Folders.item(),KeepDays);
}
}
//调用函数,比如:"F:\\log",5 或 "C:\\windows\\system32\\LogFiles",5
DelIISLog("D:\\IISLogTest",2);
//调用方法:DelIISLog("IIS日志所在路径",保留多少天的IIS日志);
//遍历IIS日志文件夹下的所有文件及子文件夹下的文件
function DelIISLog(IISLogPath,KeepDays){
var fso = new ActiveXObject("Scripting.FileSystemObject");
var f = fso.GetFolder(IISLogPath);
var Folders = new Enumerator(f.SubFolders); //得到该目录下所有的文件夹的集合
var Files = new Enumerator(f.Files); //得到该目录下所有的文件的集合
//第一步处理当前目录下的所有文件
for (; !Files.atEnd(); Files.moveNext()) {
var fileName = Files.item().name;
var year = "20" + fileName.substr(2, 2);
var mouth = fileName.substr(4, 2);
var day = fileName.substr(6, 2);
var days = Math.round(((new Date()).getTime() - Date.UTC(year, mouth - 1, day)) / 1000 / 60 / 60 / 24);
if (days > KeepDays) Files.item().Delete(); //判断是不是要处理的IIS日志文件,如果是的话直接删除
}
//第二步处理当前目录下的所有目录,进行递归调用
for (; !Folders.atEnd(); Folders.moveNext()) {
DelIISLog(Folders.item(),KeepDays);
}
}
//调用函数,比如:"F:\\log",5 或 "C:\\windows\\system32\\LogFiles",5
DelIISLog("D:\\IISLogTest",2);
IIS日志清理WSH版代码(DelIISLog.wsf):
<job id="IIS日志清理WSH版代码(DelIISLog.wsf) Made by www.yongfa365.com">
<script language="vbscript">
'作者:柳永法(yongfa365)'Blog
'修改:2007-11-15
'操作说明:此文件只能清除一天的日志,得使用计划任务让其每天执行一次,因为服务器上一般都禁用WScript.Shell,所以不推荐使用
Function DelIISLog(IISLogPath,beforedays)
d=Now-beforedays
If Right(IISLogPath,1) <> "\" Then IISLogPath=IISLogPath & "\"
p= IISLogPath & "ex" & Right(Year(d),2) & Right("0" & Month(d),2) & Right("0" & Day(d),2) & ".Log"
Set WshShell = WScript.CreateObject("WScript.Shell")
wscript.echo p
WshShell.Run ("cmd.exe /c del /s " & p)
Set WshShell = Nothing
End Function
DelIISLog "D:\IISLogTest",2
</script>
</job>
<script language="vbscript">
'作者:柳永法(yongfa365)'Blog
'修改:2007-11-15
'操作说明:此文件只能清除一天的日志,得使用计划任务让其每天执行一次,因为服务器上一般都禁用WScript.Shell,所以不推荐使用
Function DelIISLog(IISLogPath,beforedays)
d=Now-beforedays
If Right(IISLogPath,1) <> "\" Then IISLogPath=IISLogPath & "\"
p= IISLogPath & "ex" & Right(Year(d),2) & Right("0" & Month(d),2) & Right("0" & Day(d),2) & ".Log"
Set WshShell = WScript.CreateObject("WScript.Shell")
wscript.echo p
WshShell.Run ("cmd.exe /c del /s " & p)
Set WshShell = Nothing
End Function
DelIISLog "D:\IISLogTest",2
</script>
</job>
有时我拿到别人的代码时我得写一堆东西来测试,现在这个如果让您去测试的话,您不会直接在服务器上测试吧,所以,以下再贴出本人柳永法的测试脚本,主要是在D盘生成一个测试文件夹,及一些IIS测试日志文件,
IIS日志清理之IIS日志生成系统(CreateIISLog.vbs):
'IIS日志清理之IIS日志生成系统(CreateIISLog.vbs) Made by www.yongfa365.com
'创建文件夹
Function CreateFolder(Folder)
On Error Resume Next
Set FSO = CreateObject("Scripting.FileSystemObject")
FSO.CreateFolder(Folder)
If Err>0 Then
Err.Clear
CreateFolder = False
Else
CreateFolder = True
End If
End Function
'创建文件
Function CreateFile(FileName, Content)
On Error Resume Next
Set FSO = CreateObject("Scripting.FileSystemObject")
Set fd = FSO.CreateTextFile(FileName, True)
fd.WriteLine Content
If Err>0 Then
Err.Clear
CreateFile = False
Else
CreateFile = True
End If
End Function
CreateFolder "D:\IISLogTest"
CreateFolder "D:\IISLogTest\IISLogs001"
CreateFolder "D:\IISLogTest\IISLogs002"
CreateFolder "D:\IISLogTest\IISLogs003"
for i=1 to 30
d=date-i
filename="ex" & right(year(d),2) & right("0" & month(d),2) & right("0" & day(d),2) & ".log"
CreateFile "D:\IISLogTest\" & filename,Content
CreateFile "D:\IISLogTest\IISLogs001\" & filename,Content
CreateFile "D:\IISLogTest\IISLogs002\" & filename,Content
CreateFile "D:\IISLogTest\IISLogs003\" & filename,Content
'创建文件夹
Function CreateFolder(Folder)
On Error Resume Next
Set FSO = CreateObject("Scripting.FileSystemObject")
FSO.CreateFolder(Folder)
If Err>0 Then
Err.Clear
CreateFolder = False
Else
CreateFolder = True
End If
End Function
'创建文件
Function CreateFile(FileName, Content)
On Error Resume Next
Set FSO = CreateObject("Scripting.FileSystemObject")
Set fd = FSO.CreateTextFile(FileName, True)
fd.WriteLine Content
If Err>0 Then
Err.Clear
CreateFile = False
Else
CreateFile = True
End If
End Function
CreateFolder "D:\IISLogTest"
CreateFolder "D:\IISLogTest\IISLogs001"
CreateFolder "D:\IISLogTest\IISLogs002"
CreateFolder "D:\IISLogTest\IISLogs003"
for i=1 to 30
d=date-i
filename="ex" & right(year(d),2) & right("0" & month(d),2) & right("0" & day(d),2) & ".log"
CreateFile "D:\IISLogTest\" & filename,Content
CreateFile "D:\IISLogTest\IISLogs001\" & filename,Content
CreateFile "D:\IISLogTest\IISLogs002\" & filename,Content
CreateFile "D:\IISLogTest\IISLogs003\" & filename,Content
后记:这个方法不仅可以用在IIS日志处理方面,还可以用在处理Serv-U的日志处理,前提条件是Serv-U的日志文件的格式也得设成像IIS日志这样的格式ex071115.log。
如果你想让你的IIS支持wml,做个wap网站,只需作小小的改变就行了.虽然目前支持wml的虚拟主机极少,但是自己在本机上玩玩也好的.
首先在打开IIS,然后在默认网站的属性--HTTP头--MMIE映射--文件类型--添加注册文件的类型:
Associated Extension MIME Type
wml text/vnd.wap.wml
wmlc application/vnd.wap.wmlc
wbmp image/vnd.wap.wbmp
wmlsc application/vnd.wap.wmlscriptc
wmls text/vnd.wap.wmlscript
wsc application/vnd.wap/wmlscriptc
现在你就可以在你的站点添加wml文件了.可以用手机模拟器来浏览,或者opera浏览器浏览.如果你的主机是对外发布的,那你就可以用手机来浏览你的网站了.
如果是用ASP生成wml,必须包含这句:<% Response.ContentType="text/vnd.wap.wml" %>
例如这个例子:test.asp
首先在打开IIS,然后在默认网站的属性--HTTP头--MMIE映射--文件类型--添加注册文件的类型:
Associated Extension MIME Type
wml text/vnd.wap.wml
wmlc application/vnd.wap.wmlc
wbmp image/vnd.wap.wbmp
wmlsc application/vnd.wap.wmlscriptc
wmls text/vnd.wap.wmlscript
wsc application/vnd.wap/wmlscriptc
现在你就可以在你的站点添加wml文件了.可以用手机模拟器来浏览,或者opera浏览器浏览.如果你的主机是对外发布的,那你就可以用手机来浏览你的网站了.
如果是用ASP生成wml,必须包含这句:<% Response.ContentType="text/vnd.wap.wml" %>
例如这个例子:test.asp
<%@ Language=VBScript %>
<% Response.ContentType="text/vnd.wap.wml" %>
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<card id="main">
<p>
Just A test on my wap site!
</p>
</card>
</wml>
<% Response.ContentType="text/vnd.wap.wml" %>
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<card id="main">
<p>
Just A test on my wap site!
</p>
</card>
</wml>
IIS配置文件(MetaBase.bin)后门
[ 2008/12/08 21:42 | by selboo ]
本文的内容是如何利用IIS本身的一些特性建立后门.当然,这主要是一份供网络管理员和网络安全工作人员参考的“Know Your Enemy”类文档,作者希望这篇文章能够对检查和清除后门有所帮助,而并不鼓励或赞同利用本文的技巧进行违法活动.
首先简单介绍一下IIS的配置文件MetaBase.bin.这个文件位于%SystemRoot%\system32\inetsrv\MetaBase.bin,包含了几乎所有IIS的配置信息,是非常重要的系统文件.简单的说,我们在“intenet服务管理器”中所作的一切设置最终都会被保存在MetaBase.bin中.在日常的系统管理中除了通过“intenet服务管理器”来对MetaBase.bin进行操作外,Windows还提供了一个脚本adsutil.vbs可以对MetaBase.bin进行操作.
MetaBase的结构类似于注册表,也是树形结构,有类似键、值、项的概念.事实上在IIS3和PWS中,MetaBase的内容就是存储在注册表中的.MetaBase有两个主键:LM和Schema.其中,Schema保存了系统默认的一些配置,通常不需要修改,一旦改错也非常危险,所以无论是“intenet服务管理器”还是adsutil.vbs都没有提供修改Schema的机制.LM中包含了IIS的HTTP服务,FTP服务,SMTP服务等的配置信息.其中,LM/W3SVC/下是我们要用到的HTTP服务的配置信息.
几个下面会提到的值:
LM/W3SVC/InProcessIsapiApps,进程内启动ISAPI.这是一个数组,里面包含的是一组指向一些ISAPI的路径.在这个数组里面的ISAPI运行的时候都是由inetinfo.exe直接启动的,继承inetinfo.exe的local system权限;而不在其中的ISAPI则是由svchost.exe派生的dllhost.exe进程启动的,运行的身份是IWAM_NAME,当然,这是IIS默认的安全级别“中”的情况下,如果设为低,那么所有ISAPI都会由inetinfo.exe直接派生.另外,如果设定的时候不指定路径,而是仅指定一个扩展名,那么任何路径下的同名ISAPI在被调用的时候都会以system权限执行.
ScriptMaps,脚本映射.在某个目录下设定该值后,则向该目录请求的特定扩展名的文件会交给指定的ISAPI执行.需要强调的是,设定ScriptMaps的目录并不一定要真实存在的,只要在MetaBase中某个HTTP实例的root键下建了一个子键,对该字键同名目录的HTTP请求IIS会认为是合法的,并会交由映射的ISAPI处理.这也算是IIS的一个问题吧.
CreateProcessAsUser,在某个目录下指定改值为0,则该目录下的应用程序会继承inetinfo.exe的local system权限.
AccessWrite,决定某个目录是否允许写入,也就是WEBDAV的PUT方法.
AccessExecute,决定某个目录是否允许执行应用程序.
后门思路:
创建一个特定扩展名的脚本映射,指向我们的ISAPI,并把该ISAPI添加到InProcessIsapiApps列表中.那么我们向服务器请求该扩展名类型文件时就会在服务器上以local system权限执行该ISAPI,且所请求的文件并不需要是真实存在的.
技巧:
1、既然并不需要真的建一个目录来设定ScriptMaps,那么就可以只写一个键,并给这个键加上ScriptMaps.这样,从“intenet服务管理器”里是看不出这个目录的,更看不到这个ScriptMaps.
2、虽然“intenet服务管理器”里面看不出来,但是有经验的管理员可能习惯于偶尔用adsutil.vbs enum /p来看一下:
# adsutil.vbs enum /p /w3svc/1/root
Microsoft (R) Windows Script Host Version 5.6
版权所有(C) Microsoft Corporation 1996-2001.保留所有权利.
[/w3svc/1/root/_vti_bin]
[/w3svc/1/root/evildir]
这样就暴露了.
因为我们设的那个键并不是真实存在的虚拟目录,只是配置文件中的一个字符串,所以可以使用0x08这样的字符来做键值.0x08是Backspace键对应的16进制值,控制台上显示的效果是向左边删除一个字符,其实就是把“/”给删了:
# adsutil.vbs enum /p /w3svc/1/root
Microsoft (R) Windows Script Host Version 5.6
版权所有(C) Microsoft Corporation 1996-2001.保留所有权利.
[/w3svc/1/root/_vti_bin]
[/w3svc/1/root]
面对这种输出,一般人是不会留意的.
当然也可以设为类似_vti_script,_vti_bin这样的名字,只要不设KeyType,在“intenet服务管理器”中是看不见的.
因为系统中本身InProcessIsapiApps中有一个\WINNT\System32\msw3prt.dll,是.printer的映射,一般用不上.我们可以删掉D:\WINNT\System32\msw3prt.dll的值,换上\WINNT\System32\inetsrv\msw3prt.dll.
3、美中不足的是HTTP请求会留下痕迹,但是HTTP也有好处,那就是可以随便用一个代理服务器做跳板.另外,也可以用插入0x0D 0x0A来伪造日志的方法,(详见《Apache,IIS等多种http服务器允许通过发送回车符伪造日志》一文)这就是构造目录的技巧了.
具体实现:
当然可以用adsutil.vbs手工来加.不过需要注意,adsutil.vbs只能设,不能改,所以用adsutil.vbs的时候一定要把原先的也加上,否则原先的就会丢失.不同条目之间用空格分开.
先用下面命令取得当前的InProcessIsapiApps列表:
adsutil.vbs get /W3SVC/InProcessIsapiApps
取到之后把自己的ISAPI路径也加进去.
adsutil.vbs set /W3SVC/InProcessIsapiApps "C:\WINNT\System32\idq.dll" "C:\WINNT\System32\inetsrv\httpext.dll" ………………
ScriptMaps的设定同InProcessIsapiApps.
当然这样比较麻烦,也无法写入0x08这样的键值,所以我干脆自己写个VBS一次性搞定.至于那个做后门的ISAPI,能实现的功能就完全取决于想象力了.这里是一个简单例子的屏幕拷贝:
# nc 10.11.0.26 80
POST /%08/anything.tom
Microsoft Windows 2000 [Version 5.00.2195]
(C) 版权所有 1985-1998 Microsoft Corp.
C:\WINNT\system32>whoami
NT AUTHORITY\SYSTEM
C:\WINNT\system32>exit
HTTP/1.1 200 OK
Server: Microsoft-IIS/5.0
Date: Wed, 08 Jan 2003 06:49:37 GMT
更隐蔽的方法是写一个特殊的ISAPI,并注册为解析asp的.通常情况下,该程序把收到的请求转给系统原来的asp.dll,并把结果返回,当收到一个特殊POST请求时就启动自己的后门代码,这样日志里面也不会有什么显示.审核时也很难发现.
除了上面所述利用脚本映射的方法外,还可以赋予某个虚拟目录AccessWrite和AccessExecute权限.需要运行后门的时候利用WEBDAV上载ISAPI,然后运行,使用完了再删除.(是否能删除?还是需要restart W3SVC ?我没有试验.)如果上载的不是DLL而是EXE文件,那么把该目录下的CreateProcessAsUser设为0也可以获得local system权限,这个方法早有人撰文论述.但AccessWrite和AccessExecute的改变都可以在“intenet服务管理器”中看出来,隐蔽性就差了.
首先简单介绍一下IIS的配置文件MetaBase.bin.这个文件位于%SystemRoot%\system32\inetsrv\MetaBase.bin,包含了几乎所有IIS的配置信息,是非常重要的系统文件.简单的说,我们在“intenet服务管理器”中所作的一切设置最终都会被保存在MetaBase.bin中.在日常的系统管理中除了通过“intenet服务管理器”来对MetaBase.bin进行操作外,Windows还提供了一个脚本adsutil.vbs可以对MetaBase.bin进行操作.
MetaBase的结构类似于注册表,也是树形结构,有类似键、值、项的概念.事实上在IIS3和PWS中,MetaBase的内容就是存储在注册表中的.MetaBase有两个主键:LM和Schema.其中,Schema保存了系统默认的一些配置,通常不需要修改,一旦改错也非常危险,所以无论是“intenet服务管理器”还是adsutil.vbs都没有提供修改Schema的机制.LM中包含了IIS的HTTP服务,FTP服务,SMTP服务等的配置信息.其中,LM/W3SVC/下是我们要用到的HTTP服务的配置信息.
几个下面会提到的值:
LM/W3SVC/InProcessIsapiApps,进程内启动ISAPI.这是一个数组,里面包含的是一组指向一些ISAPI的路径.在这个数组里面的ISAPI运行的时候都是由inetinfo.exe直接启动的,继承inetinfo.exe的local system权限;而不在其中的ISAPI则是由svchost.exe派生的dllhost.exe进程启动的,运行的身份是IWAM_NAME,当然,这是IIS默认的安全级别“中”的情况下,如果设为低,那么所有ISAPI都会由inetinfo.exe直接派生.另外,如果设定的时候不指定路径,而是仅指定一个扩展名,那么任何路径下的同名ISAPI在被调用的时候都会以system权限执行.
ScriptMaps,脚本映射.在某个目录下设定该值后,则向该目录请求的特定扩展名的文件会交给指定的ISAPI执行.需要强调的是,设定ScriptMaps的目录并不一定要真实存在的,只要在MetaBase中某个HTTP实例的root键下建了一个子键,对该字键同名目录的HTTP请求IIS会认为是合法的,并会交由映射的ISAPI处理.这也算是IIS的一个问题吧.
CreateProcessAsUser,在某个目录下指定改值为0,则该目录下的应用程序会继承inetinfo.exe的local system权限.
AccessWrite,决定某个目录是否允许写入,也就是WEBDAV的PUT方法.
AccessExecute,决定某个目录是否允许执行应用程序.
后门思路:
创建一个特定扩展名的脚本映射,指向我们的ISAPI,并把该ISAPI添加到InProcessIsapiApps列表中.那么我们向服务器请求该扩展名类型文件时就会在服务器上以local system权限执行该ISAPI,且所请求的文件并不需要是真实存在的.
技巧:
1、既然并不需要真的建一个目录来设定ScriptMaps,那么就可以只写一个键,并给这个键加上ScriptMaps.这样,从“intenet服务管理器”里是看不出这个目录的,更看不到这个ScriptMaps.
2、虽然“intenet服务管理器”里面看不出来,但是有经验的管理员可能习惯于偶尔用adsutil.vbs enum /p来看一下:
# adsutil.vbs enum /p /w3svc/1/root
Microsoft (R) Windows Script Host Version 5.6
版权所有(C) Microsoft Corporation 1996-2001.保留所有权利.
[/w3svc/1/root/_vti_bin]
[/w3svc/1/root/evildir]
这样就暴露了.
因为我们设的那个键并不是真实存在的虚拟目录,只是配置文件中的一个字符串,所以可以使用0x08这样的字符来做键值.0x08是Backspace键对应的16进制值,控制台上显示的效果是向左边删除一个字符,其实就是把“/”给删了:
# adsutil.vbs enum /p /w3svc/1/root
Microsoft (R) Windows Script Host Version 5.6
版权所有(C) Microsoft Corporation 1996-2001.保留所有权利.
[/w3svc/1/root/_vti_bin]
[/w3svc/1/root]
面对这种输出,一般人是不会留意的.
当然也可以设为类似_vti_script,_vti_bin这样的名字,只要不设KeyType,在“intenet服务管理器”中是看不见的.
因为系统中本身InProcessIsapiApps中有一个\WINNT\System32\msw3prt.dll,是.printer的映射,一般用不上.我们可以删掉D:\WINNT\System32\msw3prt.dll的值,换上\WINNT\System32\inetsrv\msw3prt.dll.
3、美中不足的是HTTP请求会留下痕迹,但是HTTP也有好处,那就是可以随便用一个代理服务器做跳板.另外,也可以用插入0x0D 0x0A来伪造日志的方法,(详见《Apache,IIS等多种http服务器允许通过发送回车符伪造日志》一文)这就是构造目录的技巧了.
具体实现:
当然可以用adsutil.vbs手工来加.不过需要注意,adsutil.vbs只能设,不能改,所以用adsutil.vbs的时候一定要把原先的也加上,否则原先的就会丢失.不同条目之间用空格分开.
先用下面命令取得当前的InProcessIsapiApps列表:
adsutil.vbs get /W3SVC/InProcessIsapiApps
取到之后把自己的ISAPI路径也加进去.
adsutil.vbs set /W3SVC/InProcessIsapiApps "C:\WINNT\System32\idq.dll" "C:\WINNT\System32\inetsrv\httpext.dll" ………………
ScriptMaps的设定同InProcessIsapiApps.
当然这样比较麻烦,也无法写入0x08这样的键值,所以我干脆自己写个VBS一次性搞定.至于那个做后门的ISAPI,能实现的功能就完全取决于想象力了.这里是一个简单例子的屏幕拷贝:
# nc 10.11.0.26 80
POST /%08/anything.tom
Microsoft Windows 2000 [Version 5.00.2195]
(C) 版权所有 1985-1998 Microsoft Corp.
C:\WINNT\system32>whoami
NT AUTHORITY\SYSTEM
C:\WINNT\system32>exit
HTTP/1.1 200 OK
Server: Microsoft-IIS/5.0
Date: Wed, 08 Jan 2003 06:49:37 GMT
更隐蔽的方法是写一个特殊的ISAPI,并注册为解析asp的.通常情况下,该程序把收到的请求转给系统原来的asp.dll,并把结果返回,当收到一个特殊POST请求时就启动自己的后门代码,这样日志里面也不会有什么显示.审核时也很难发现.
除了上面所述利用脚本映射的方法外,还可以赋予某个虚拟目录AccessWrite和AccessExecute权限.需要运行后门的时候利用WEBDAV上载ISAPI,然后运行,使用完了再删除.(是否能删除?还是需要restart W3SVC ?我没有试验.)如果上载的不是DLL而是EXE文件,那么把该目录下的CreateProcessAsUser设为0也可以获得local system权限,这个方法早有人撰文论述.但AccessWrite和AccessExecute的改变都可以在“intenet服务管理器”中看出来,隐蔽性就差了.