Day 2501 Avast与tcpip.sys

最近一次更新过病毒库之后,许多办公室被修改过连接数限制的tcpip.sys被Avast认作了【Win32/Malware-gen】,搞笑的是来源进程是Avast自己的AvastSvc.exe,当然试图操作tcpip.sys的文件也会引起警告。此时如果将文件进行移入隔离区、删除等操作,理所当然地系统就会无法上网,特征为【本地连接】中连接信息显示为空,发送、接收字节持续为0,以及尝试修复的时候显示【获取该连接的TCP/IP属性失败】等。

经过搜索找到一种重装TCP/IP协议的做法,简述如下:

1、启动注册表编辑器,删除以下项:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Winsock

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Winsock2

2、查找【C:\Windows\inf\nettcpip.inf】(如系统目录不同,请自行修改),找到以下内容:

Characteristics = 0xA0

将后面的0xA0修改为【0x80】。

3、打开【本地连接】属性,选择【安装】【协议】,点击【从磁盘安装】,定位到【C:\Windows\inf\nettcpip.inf】打开,然后安装提示【这个驱动没用进行数字签署】的【Microsoft TCP/IP协议】。

4、回到【本地连接】属性窗口,选择【TCP/IP协议】,点击【卸载】按钮将其删除,并按照提示重新启动计算机。

5、重启完成后,再次打开【本地连接】属性,重复第三步将TCP/IP协议安装回来即可。

P.S.建议不要直接使用netsh winsock reset,可能会引起更严重的问题。

Day 2495 Windows Fundamentals for Legacy PCs

在看Wiki的词条时发现微软曾经出过这么一个版本:Windows Fundamentals for Legacy PCs,简称WinFLP,乃是为XP年代不足以升级的PC提供的版本,并且只以授权形式提供给客户而不在市场上出售,本质上是官方精简的、带SP2的XP。

搜了一下找到了ISO,有两个文件,WFLP2k6.iso是系统安装盘WFLPMUI1.iso则是语言包

继续阅读 “Day 2495 Windows Fundamentals for Legacy PCs”

Day 2478 Windows Update 0x80070490

服务器上安装了Windows Server 2008(不是r2),最近在更新完SP2后,一直卡在KB967723和KB2443685上动弹不得,点击安装,过会儿就会失败,反复如此。众所周知服务器不打补丁不是个事儿,于是上网搜索解决方案。
首先再次证明了百度在解决技术问题时真的sucks,本来寄希望于能找到中文解答方案的,有了前车之鉴,第一页没有就换Bing了(因为最近有个数字很大,Google受其原力影响暂时被压制中)。在微软社区的这篇帖子内找到一种方法:

我也遇到这个问题。刚出现这两个更新的时候我就觉得很奇怪:因为这两个更新的发布日期是9月份,KB上也没说进行过版本更新。我就在“已安装更新列表”中找,果然发现早就安装好了。在Windows Update中,这两个更新硬是装不上,反复提示错误代码80070490。抱着试试看的想法,我先在“已安装的更新”中找到这两个更新,卸载。再从Windows Update中安装,一切搞定。再次搜索更新,这两个更新再也没出现。问题至此解决。
但到底是如何产生的,目前还没想明白。之前装过一个英语语言包,不知道同这又没有关系。

按照这个方法,还真在「已安装的更新」里面找到了这两个KB,卸载之,但继续安装的时候仍然提示失败,错误代码都没变,重启依旧。由于已经到了下班时间,遂决定明天过来解决。
今天一上班,发现Windows Update中的更新由2个变成了60个,再次安装顺利通过,不知道是不是系统刷新了需要安装的补丁列表的缘故?

Day 2476 CDNZZ邀请码

换主机之后一直遭受功夫之苦,于是转了半天找到CDNZZ,目前使用中。
这年头找个免费且靠谱的CDN不容易,所以把自己的邀请码在这里放一下,有需要请拿走。

508031626298 ← 不知道谁用了没说话
508028933159
508094364389
508045665108
508062627063
508067056364
508031227315
508069183162
508076712505
508079450291

P.S.虽然不知道会不会有人搜到这里,不过如果有人使用了以上邀请码,请在下方评论告知,以便标记为已使用,谢谢!

Day 2468 Apache Win32DisableAcceptEx

前阵子以及今天,单位的两台使用Apache的服务器相继在error log里冒出10038错误「在一个非套接字上尝试了一个操作」的记录,前一台服务器在按照重置Winsock之后成功解决,后一台因为需要保持其上运行的一些应用在线,所以想尽量保持服务器开机状态,于是上网找方法。
一番搜寻后,基本上都是如下的解决方案(这次百度居然也不是只有垃圾回答了;另外文章里出现的排版错误和书写错误都没有修改,「尊重」原文):

  在网上查了一下,发现很多人碰到这个情况,原因是Apache 的AcceptEx在window下会出现这种问题,只在APAche2.0.49以上版本会有这中问题。 《Apache 2_2 中文版参考手册》上说:“AcceptEx()是一个微软的WinSock2 API ,通过使用BSD风格的accept() API提供了性能改善。一些流行的Windows产品,比如防病毒软件或虚拟专用网络软件,会干扰AcceptEx()的正确操作。如果你遇到类似于如下 的错误:一般的解决办法是关闭 AcceptEx()”。也就是说,可能是 Windows Update 或是防火墙、防毒软件更新了某些网络原件,造成 Microsoft WinSock v2 API 动作不正常,会干扰WinSock2 API,就会影响AcceptEx()的正确操作,就可能出现上面所出现的问题。但是关闭会影响Apache的性能。需要自己权衡利弊。因此如果没有什么 错误发生,最好还是不要随便关闭这个功能比较好吧。
解决办法:在httpd.conf文件中添加 Win32DisableAcceptEx 标记,如下:
<IfModule mpm_winnt.c>
ThreadsPerChild 1000
MaxRequestsPerChild 10000
Win32DisableAcceptEx
</IfModule>
这样可以允许并发连接更大一些。同时性能上也不会有明显的降低. 一般,这样设置基本就能搞定,但是我碰到的情况,就是想上面那样关闭AcceptEx,也会出现类似问题,Apache还是不能正常运作, error.log 出项了大量的:Sat Dec 24 17:21:28 2006] [warn] (OS 64)指定的网络名不再可用。 : winnt_accept: Asynchronous AcceptEx failed.。又找了一下,发现了如下的一种解决办法,我试了试,果然可以,而且在多台服务器上试过,只要出现了AcceptEx 的问题,就能解决,具体设置为: 1、网上邻居-;本地连接-;属性-;internet协议(TCP/IP)-;属性-;高级-;wins标签-;去掉启用LMhosts查询前的勾. 2、控制面版-;windows防火墙-;高级标签-;本地连接设置-;服务的标签里勾选安全Web服务器(HTTPS)。 3、然后退出Apache,再打开启动就可以了 ,一开始我没有退出,直接在那重启,就是不可以,一定要先停止,在开启即可。

不过这样修改之后并没有解决问题,连后面对本地连接和防火墙的修改也做了。疑惑之下,为了尽快处理,还是使用netsh winsock reset解决了问题。

Day 2416 诡异ICS平板「南都PAI」的Root

单位为了研究所谓「全媒体」,购买了一部南方报业集团出品的「南都PAI」,就是下图这个东西:

此机器具体配置为:A8(1Ghz)、1GB内存、8GB闪存、1024×768分辨率,运行ICS 4.0.3,官方售价912元,实在是个不折不扣的山寨机,实际使用体验也不太怎么样,触摸屏反应有点迟钝,机器本身的速度也没有好到哪里去。

想必很多人拿到安卓设备第一件事就是root删预装软件,但这款平板相对比较奇葩:官方网站上只有广告和售卖链接,不要说技术支持了,连ADB驱动都没得下。在Google官方ADB认不出来这机器的情况下,经过多方搜索,终于用一款型号为CT705的平板驱动连接成功。

原帖在这里,相应的工具在这里下载(4shared),本地备份点击此处下载

首先为平板指定安装压缩包内的ADB驱动,然后在平板上启用调试模式(设置-开发人员选项-调试模式),使用root(本来是Xperia的平板用的)工具即可。

Day 2390 错误1747:未知的身份验证服务

晚上开电脑时遇到了奇怪的问题,Win 7 SP1 系统,输入密码后,一直卡在「欢迎」,硬盘也不闪,敲击两次Ctrl+Alt+Del后打开安全菜单,进入任务管理器,发现只有五六个进程在运行,桌面是黑色的。
重新启动,进入网络安全模式,照样是黑色桌面,不过多了一点消息,屏幕右下角出现一个黑色气泡,字很多,大致写的是「System Event Notification Service」服务不能使用,系统日志无法写入,请去事件查看器检查详细原因云云。
再次重启,使用基本安全模式,这次桌面成功出现,前述的气泡也再次冒出,遂去开事件查看器,却被报告「事件日志服务不可用」,于是跑到服务管理,看到Windows Event Log处于「停止+自动」状态,尝试启动之,提示「错误1747:未知的身份验证服务」。
此时网络不可用,遂抄起手机来Google原因,最后找到一个方法:

以管理员模式运行cmd,运行「netsh winsock reset」,无视出错信息,重启即可。

试之,完胜收工,看来是Winsock相关的注册表信息出了问题。

注1:如果遇到技术问题,尤其是古怪的问题,千万不要在中文搜索引擎上浪费时间
注2:最早的原因是因为使用了迅游,迅游是网游加速器中的一朵奇葩,有很高的概率会造成系统的Winsock设置被破坏,虽然可以通过以上方式修复,但需要重启很麻烦,而且越新的版本出问题的概率越大(2012版本为99.9999%),官方也从未认真考虑过这个问题,建议如果出现过类似问题的用户不要再使用其服务。

Day 2317 VB.Net URLEncode for OAuth

之前一直用自己写的URLEncode方法,但对于UTF-8的字符处理不太好,勉强能用,最近测试饭盒的搜索功能时发现勉强能用就等于不能用(对汉字的编码完全不对),只好重新把HTTPUtility.URLEncode引入进来,然后对其不正确的处理进行修正。
以下为相应代码,有两点要注意:
1. 需要先行添加System.Web的引用,如果找不到这个引用,检查目标Framework是不是用了Client Profile。
2. 最后一次将%253D替换为%3D用于将二次编码的「=」符号(编码后为%3D,二次编码后为%253D)替换回一次编码。理论上按照RFC 5849和饭否自己的文档,GET方法的QueryString应当经过一次URL Encode,然后在生成Base String然后签名的时候被二次编码,但饭否的API如果在Base String中检测到%253D时,将会返回Invalid Signature错误,并且给出认可的Base String中「=」显示为%3D,不知道是不是部署时出现的问题。

Private Function doURLEncode(ByVal s As String) As String
        'URLEncode function with corrections for OAuth Basestr making
        s = HttpUtility.UrlEncode(s).Replace("+", "%20")
        'Make the lowercased percent-encoded codes into uppercase
        s = RegularExpressions.Regex.Replace(s, "(%[0-9a-f][0-9a-f])", Function(c) c.Value.ToUpper)
        'Encode the chars RFC requested to encode but the HTTPUtility.URLEncode didn't
        s = s.Replace("(", "%28").Replace(")", "%29").Replace("$", "%24").Replace("!", "%21").Replace("*", "%2A").Replace("'", "%27")
        'Decode the char [~] RFC requested NOT to encode but HTTPUtility.URLEncode did
        s = s.Replace("%7E", "~")
        'Both the RFC and API document did not say [=] is a special character, but the API won't accept %253D.
        s = s.Replace("%253D", "%3D")
        Return s
    End Function

Day 2294 U盘关机检测脚本

放在自己办公机上的,用来在关机的时候检测已登记但尚未移除的USB存储设备。
不过,若是处于充电模式而未通知系统Plugged-in事件的设备就没办法了。

'USB可移动磁盘检测脚本
'Nov.3 2011 by Lucsiro Touka
'参考脚本: http://www.codeguru.com/forum/showthread.php?t=408639
'
'本脚本用于检测系统中已装载的USB存储类设备,初衷是为了在关机时提示用户有未拔下的U盘、移动硬盘等。
'将本脚本保存为vbs,加入注销脚本列表(组策略—本地计算机策略—用户配置—Windows设置—脚本(登录/注销)—注销)即可达到关机提示的效果。

strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colDiskDrives = objWMIService.ExecQuery("SELECT * FROM Win32_DiskDrive WHERE InterfaceType = 'USB'")

i=1

For Each objDrive In colDiskDrives
	sExistDevice = sExistDevice & i & ". " & objDrive.Caption & vbCrlf
	i = i + 1
Next

If sExistDevice <> "" Then Msgbox "下列USB移动存储设备尚未卸载。" & vbCrlf & "请手动移除其中需要卸载的设备后,单击确定继续关机。" & vbCrlf & sExistDevice, vbInformation, "有尚未卸载的USB移动存储设备"

使用效果: