解决Windows 资源保护找到了损坏文件但无法修复问题

今天Windows 8.1系统的电脑突然卡住并且自动重启,通过事件查看器得到的资料有限,初步怀疑是系统文件受损导致,于是通过经典的sfc /scannow验证系统并修复受损文件,但是得到以下提示:

开始系统扫描。此过程将需要一些时间。

开始系统扫描的验证阶段。
验证 100% 已完成。

Windows 资源保护找到了损坏文件但无法修复
其中某些文件。CBS.Log windir\Logs\CBS\CBS.log 中有详细信息。
例如 C:\Windows\Logs\CBS\CBS.log。请注意,在脱机服务方案中,
当前不支持日志记录。

继续阅读

彻底防止Windows 7/8/8.1升级更新到Windows 10

去年7月写过一篇文章讲解如何去除扰人的获取Windows 10的图标,那时候微软也只是推送了获取Windows 10的提示,具体安装Windows 10与否还是有显著的选项让用户自己选择的。

虽然通过先前的方法确实抑制了升级Windows 10的提示,怎奈微软接下来连续放大招推送升级补丁,并且不怎么明显的“诱使”用户升级系统,比如我遇到的微软健康助手提示升级,并且默认勾选同意的坑。其实我不是说Windows 10不好,就是较为反感微软的推送方式,就好像你去商场老是有业务员跟着你,不停向你推荐某某产品好等等,而且因为大部分客户电脑上一些业务系统在Windows 10下存在各种兼容问题,就有客户反应因为不小心升级Windows 10导致业务软件不能正常运行最后只有重新安装老系统(其实对于误安装有办法直接恢复到老系统,方法附本文后)

继续阅读

彻底关闭并卸载任务栏右下角获取Windows 10图标提示

微软为推销Windows 10可谓是不遗余力,居然强制向广大的Windows 7和Windows 8/8.1用户进行了推送,其结果是小伙伴们发现电脑的右下角出现一个“获取 Windows 10”(英文版:Get Windows 10)的图标,但对于我这样的没有升级欲望的,看到这样的图标颇为不爽,打开任务管理器,居然还有一个GWX.exe的进程,罢了,罢了,反正我也知道可以升级Windows 10,但占用我可怜的内存资源则不能忍受了,所以决定卸载并移除该提示。

Get Windows 10 icon

首先查阅了网上的资料,发现大家都从更新入手,已知更新代号为KB3035583,那么直接卸载,问题不是解决了吗?非也非也,该更新被标注为高优先级,也就是说只能解燃眉之急,不能做长久打算,过一段时间“获取 Windows 10”(为了简便,下文称为“GWX”)还是会死而复活。

继续阅读

WScript/VBScript命令行参数使用srvany.exe创建自定义服务

之前写过一篇文章介绍srvany.exe这个小工具的,今天有网友反映能否使用命令行方式创建基于srvany.exe的Windows服务,我想到之前编写的SrvanyUI软件没有命令参数直接调用的功能,本来想完善一下SrvanyUI这个软件的,苦于最近较忙,于是先用VBScript凑合写着一个命令行控制的脚本srvany.vbs,其中用到了RestartService子过程来自Rob van der Woude,在此表示感谢!

基本的思路很简单,就是先创建srvany.exe为可执行映像的NT系统服务,然后在利用注册表修改其间的配置参数,最后再启动服务。

先把srvany.vbs的代码贴在这儿,具体的使用方法稍后附上。

继续阅读

SrvanyUI服务管理工具发布

之前一篇介绍如何使用微软的实用小工具srvany.exe来添加Windows服务的文章,涉及到注册表操作,颇为不便,所以空闲之时自己编写了这个工具,算是对手动创建服务的一个简化吧。

我在想如果要写这么个软件,干脆就把功能写全一些,于是SrvanyUI这款Windows服务管理工具就诞生了,我给本软件定义的描述如下:

Windows XP/Vista/7 下NT服务管理器,用于管理Windows环境下系统服务和驱动服务项目,本软件特色是提供了利用微软实用工具srvany.exe将任何程序创建为自定义服务的人性化操作界面,除此之外还包含1.服务的创建、修改和删除;2.更改服务的状态(运行、暂停和停止);3.查看服务的详细信息,定位服务程序。

其实很多功能Windows自带的服务管理控制台(services.msc)都包含了,所以本软件突出支持利用srvany.exe创建自定义服务这项特色,另外还弥补了系统自带的服务管理器不能创建服务和删除服务的短处。

软件截图如下:

继续阅读

寻找已安装软件丢失的产品序列号(CD-KEY)

安装序列号又称为CD-KEY或者Product-Key,主要是用来验证用户是否是软件的合法拥有者,当第一次安装时可能会要求输入,输入正确后,软件才能正常安装并使用,并且以后不再需要输入这个序列号,由于序列号是唯一的,只在软件第一次安装或运行时需要,而且多数软件商喜欢把这个号写在产品说明书或者光盘上,不过随着时间的流逝我们有可能丢失这些印有序列号的说明书或者光盘,然后某一天当我们发现需要重新安装软件时,彻底杯具了。

不过下面我介绍的软件可能会补救一下,一般这些软件商喜欢在第一次输入序列号后将序列号存储入系统的注册表里,所以我们可以读取注册表来获取这类重要信息,比如说Windows XP/Vista/7操作系统的序列号就存储在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion注册表路径下,键名称为DigitalProductId,不过貌似是二进制的,没关系,我在这里为大家准备了读取Windows XP系统信息的WScript/VBScript脚本,其中有一项就是解码并获取系统安装序列号:

继续阅读

取消开机输入密码并实现Windows系统的自动登录

一般Windows系统在默认账户比如Administrator没有设置密码的情况下,我们可以自动登录系统,但是在某些情景下可能不是这样,比如服务器版的Windows,还有一些做了特别设置的系统,大家可能惊讶的发现,即使没有密码,系统也会弹出个登录框,在服务器系统上还会出现个按Ctrl+Alt+Shift继续的对话框,当然这也是为了安全考虑,不过这样大家往往需要多一步才能进入系统,如何解决这个问题?

我这里先介绍两种方法:

1. 使用RunDLL32命令来帮忙

依次选择开始,运行,输入下面的语句,并确认。

rundll32 netplwiz.dll,UsersRunDll

然后系统会自动弹出一个对话框,去除“要使用本机,用户必须输入用户名密码”复选框中的勾号,然后确认。

继续阅读

使用srvany.exe将任何程序作为Windows服务运行

srvany.exe是什么?

srvany.exe是Microsoft Windows Resource Kits工具集的一个实用的小工具,用于将任何EXE程序作为Windows服务运行。也就是说srvany只是其注册程序的服务外壳,这个特性对于我们来说非常实用,我们可以通过它让我们的程序以SYSTEM账户启动,或者实现随机器启动而自启动,也可以隐藏不必要的窗口,比如说控制台窗口等等。

如何获取?

你可以通过下载并安装Microsoft Windows Resource Kits获得或者可以通过我分享的下载地址1(国内线路)下载地址2(国外线路)得到。

如何使用?

当你获取到srvany后并决定将某程序作为服务启动后,请先将srvany安装为系统服务,具体的安装方法有很多,比如说可以通过Microsoft Windows Resource Kits中另外一个实用的小工具instsrv.exe进行安装(下载地址),将srvany.exe和instsrv.exe拷贝到C:\Windows\System32\后,我们可以通过下面的命令行进行srvany.exe的服务安装:

instsrv ServiceName C:\Windows\System32\srvany.exe

ServiceName即你自己定义的服务名称,可以是要作为系统服务启动的应用程序的名称。

安装完毕后,我们需要对srvany.exe进行配置,以便于能够加载我们指定的程序,配置的方法是,开始 – 运行 – regedit,打开注册表,定位到下面的路径。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ServiceName

同样的ServiceName是你刚才安装服务时自定义的服务名称。

如果该服务名下没有Parameters项目,则对服务名称项目右击新建项,名称为Parameters,然后定位到Parameters项,新建以下几个字符串值。

名称 Application 值为你要作为服务运行的程序地址。
名称 AppDirectory 值为你要作为服务运行的程序所在文件夹路径。
名称 AppParameters 值为你要作为服务运行的程序启动所需要的参数。

比如这里是个配置实例,我们这里配置的服务名称是NGINX,其余是nginx的安装配置情况。

srvany配置

当然还有一个比较简单的做法,那就是将下面的文本保存为*.reg文件,然后双击导入注册表。

1
2
3
4
5
6
Windows Registry Editor Version 5.00 
 
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\服务名称\Parameters] 
"Application"="值为你要作为服务运行的程序地址"
"AppDirectory"="值为你要作为服务运行的程序所在文件夹路径"
"AppParameters"="值为你要作为服务运行的程序启动所需要的参数"

2011年7月14日更新

找到微软的官方文章《如何创建用户定义的服务》,大家可以看一看。

2012年2月27日更新

今天有朋友问到将某窗体程序通过srvany作为服务运行的时候,桌面右下角图标和窗体无法显示,这个就涉及到服务的运行方式了,一般服务程序是不包含窗体的,所以系统默认可能会抑制这些服务程序产生的窗体,如果你的服务程序比较特殊,确实需要出现窗体,可以参考下面的办法:

控制面板 – 管理工具 – 服务(或者 开始 – 运行 – services.msc 确认)打开服务管理器,选择你刚刚安装并需要展示窗体的服务,然后右击选择属性,切换到 “登录” 选项卡,勾选上 “允许服务与桌面交互” 然后按确定保存,重启你的服务,看看窗体是否出现了:

允许服务与桌面交互

2012年7月3日更新

为了大家利用srvany.exe创建自定义服务的方便我特别写了个名叫SrvanyUI的服务创建管理的小工具,大家可以移步这篇文章《SrvanyUI服务管理工具发布》来获得详细信息,这里放个截图:

SrvanyUI服务管理工具

2012年7月5日更新

找到微软的一篇文章可以参考《故障排除使用 Cmd.exe 的 SrvAny》

2012年7月23日更新

近期有朋友咨询为什么勾选上 “允许服务与桌面交互”,窗体程序依旧不能显示,其实这个办法只适用于Windows XP或者Windows 2003系列的操作系统,对于以上版本的Windows Vista、Windows 2008、Windows 7以及Windows 2008 R2,微软做了改变,使用了Session 0会话隔离策略,所以再使用这个办法强制服务窗体显示就会出现提示框,只有手动允许后才会出现界面,并且桌面风格也将被更改:

交互式服务检测提示

交互式服务检测

此计算机上运行的程序正在尝试显示一条消息,程序可能需要您的信息或权限来完成任务。

交互式服务检测
此计算机上运行的程序正在尝试显示一条消息
程序可能需要您的信息或权限来完成任务。

关于Vista及高版本Windows交互出现提示框是由Interactive Services Detection服务控制的。禁用此服务将不会出现上述提示框,当然窗体也就不会显示了。

更详细的信息可以参考MSDN的《Interactive Services》文章。

特别注意下面这段:

Important Services cannot directly interact with a user as of Windows Vista. Therefore, the techniques mentioned in the section titled Using an Interactive Service should not be used in new code.

如果要在新的Vista及以上操作系统上显示窗体,我们应当使用新的技术,比如使用WTSSendMessage在用户会话显示对话框,或者将服务程序与窗体分离开来再使用进程通信(推荐)。

关于编程的方法可以参考这篇文章《解决vista和win7在windows服务中交互桌面权限问题:穿透Session 0 隔离》

抱歉的是目前的办法仅限于编程方面的,其他有效的办法我暂时还没有找到。

部分参考文档:

2012年2月27日更新

对于带参数的命令行方式直接利用srvany.exe创建自定义服务请参考文章《WScript/VBScript命令行参数使用srvany.exe创建自定义服务》

END

采用插件机制的批量文件扫描及进程处理工具

由于平常工作中需要大批量处理文件,所以用蹩脚的JavaScript语言编写了这个脚本,基本实现了文件及进程的枚举扫描,然后可以通过额外插件实现处理相应的文件或者进程,插件放在plugins文件夹里。

我这里写了3个插件,分别是批量打印Word文档、枚举系统活动进程、枚举RMVB、RM、AVI、WMV、MKV格式的电影文件。
[点击这里下载]

批量文件扫描及进程处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
function Component(ActiveXObject) {
 
  // 创建对象建议使用ActiveXObject.open(名称);
  // 比如ActiveXObject.open("Word.Application");
 
  this.name = "插件名称"; // 将显示在主界面下拉框中
  this.cancel = false; // 是否取消扫描,运行中设为true会自动中止扫描
  this.success = true; // 是否处理成功
  this.log = new Log(); // 日志对象
 
  // 日志分为3种,将会在列表框反应出来
  // this.log.error("出错消息文本");
  // this.log.info("正常消息文本");
  // this.log.warning("警告消息文本");
 
  this.load = function() {
    // 加载插件时所要运行的代码
  }
 
  this.unload = function() {
    // 卸载插件时所要运行的代码
  }
 
  this.dispatch = function(parentObj, selfObj, msg){
    switch(msg) {
      case "file": // 文件处理分支
      // parentObj.self (注意这里的.self)
      //就是Scripting.FileSystemObject对象
      // selfObj为每个File对象
      break;
      case "process": // 进程处理分支
      // parentObj 就是winmgmts的GetObject对象
      // selfObj为Win32_Process 每个进程对象
      break;
    }
    return false;
  }
}

目前已知的问题
1. 某些系统上双击启动会报错,请关闭IE浏览器并清除进程中多余的iexplore.exe进程后再试,如果错误依旧,请再次手动打开IE浏览器,然后再试。如果问题还是存在,建议关闭其他浏览器。(感谢威言威语提供)
2. 外文计算机上执行可能会出错,建议将脚本内中文改成英文后再运行。(感谢解皞在日文系统下的测试)

如果有什么问题或者建议欢迎提出!