识别域控制器

有些东西,知道的发现它很简单,不知道的无从下手。这不就是一例。

想把一台linux加入到域中,网上记录倒是不少,但是都有个公共的特点,一开始就要输入域控制器和域里的kerberos服务器IP。在windows下,入域很简单,根本不用知道什么IP,在机器名那里改改就进去了。如果整个域是自己做的,那自然知道域控的IP。但如果不是自己做的,是在已经做好的环境如公司里,咋办呢?

事实上,windows能找到,说明事情是有解的,只是解该怎样找的问题。搜了一圈也终于找到了,答案很简单,那就是微软有个nltest.exe的小工具,下回来运行一下就搞定了:

用:
nltest /DCLIST:DOMAINNAME        
取得域里的控制器列表。它还会列入主域控制器(PDC)


nltest /DSGETDC:DOMAINNAME  /KDC
可以得到kerberos的IP。这就终于可以进行下面的尝试了。

微软的工具是个安装包,我把文件提出来后压缩上传了,可点此处下载。

发表在 日经 | 留下评论

强制机器重启的一个办法

一个windows 服务器出现问题了。有些系统服务无法关掉。任务管理器打不开,procexp.exe打不开。无法关机,重启。包括 shutdown.exe 命令行。

看起来,不断电重启是没有办法了。机器不在身边,远在机房,要去跑一次不容易。只能去那边断电重启了吗?不是!

分析一下原因,是服务程序出了问题导致系统的关机前关闭服务的步骤出了问题。这个时候还能运行程序,能无程桌面,说明kernel是没有问题的。
所以,如果强制调用kernel的重启函数,不关闭任何程序和服务,就能重启。

所以我写了一个程序,不通知任何程序关闭,直接调kernel重启,跟断电差不多!可能会有断电类似的数据问题。

点这里下载。  这个程序的原理就是直接调ZwShutdownSystem重启。一定要小心,管理员级别帐户不能随便双击,一双击立马黑屏重启。

发表在 原创软件 | 一条评论

升级到word press 2.7.1

升级过程还算顺利。看了升级说明,说只要上传文件,执行/wp-admin/upgrade.php 就行了。我就想,这至少也要先发wp-config.php吧?后来才搞清楚。这里说的上传文件是覆盖式上传,这样原来的文件就都还在。

但这样做的话,就留下一大堆垃圾了。我比较了一下新的2.7.1和原来的目录的内容,把原来我加的文件copy了过来。不是我加的就不管了。然后运行,升级成功。回首页一看,惨了,一片空白。

因为想就着这个机会改一下theme,所以我没有copy theme过来,也许是这个原因吧。我把theme copy过去,果然行了。赶紧下个新的theme。设为新theme。OK,一切正常。最后把发表评论的那个图片验证码的逻辑小改了一下。默认这个图片验证码是在提交按钮下面的,移动一行解决。

发表在 日经 | 留下评论

折腾了一下,加强U盘的启动能力

今天新买的群联芯片的 8G U盘启动方面遇到一点问题。过程中觉得很奇怪,当然事实上是不奇怪的,只是目前bios和千差万别导致如此了。

首先是发现我的笔记本与公司电脑不一样,调好一边另一边启不动。后来发现grub4dos的启动能力强点。
就用它了,搞定一个 case。

然而又发现,在公司同样的dell 740版电脑,A机器进BIOS发现启动可选USB-HDD,而USB-ZIP旁边标示着not present.
B机器进BIOS,情况就反过来了,USB-ZIP可用,而USB-HDD则标为not present。
这两台机器,只有BIOS的版本不一样,其它硬件都一样。因为其中一台是刷过BIOS的。

这两种不同的情况导致了严重的后果。USB-ZIP的那台机器无法启动。显示
Remove disks or other media.
Press any key to restart
经查,这句话位于活动活区的第一扇区。把它改为其它值后发现,提示信息跟着变化。

这说明,bios直接启动了第一扇区的代码,未经过mbr.(mbr上装着grub4dos)

接下来就简单了,修改一下这个第一扇区的代码。还是老办法,0x40处的0x00一定要改为0x80,这是非软盘启动的基础。这个字节表示启动的介质类型。不是软盘就得填0x80。还有就是0xe6的四个字节跳转指令全部nop掉。强制用LBA方式(扩展int 13)读盘。这样不同BIOS的CHS参数不一样的问题 可以被绕过。此外0x170处的NTLDR改为GRLDR,强制启动grub4dos.

修改完成后,这个盘就可以在两台机器上都启动了。

发表在 boot | 留下评论

真正的U盘启动安装XP系统,不需要PE

U盘启动安装XP,方法也有不少了。大约有以下几种:

1. 启动到dos,加载smartdrv, 用winnt安装。缺点:很慢。安装时无法给硬盘重新分区,不能格式化C盘。

2. 启动到WINPE,在WINPE里分区,格式化。可加载虚拟光驱,安装时选择高级,拷贝所有文件到硬盘。方法比较麻烦。

3. 某老外发明的,还做了一个大bat,把winxp先安装一半到U盘上,同用U盘装到系统上。兼容性差,不能从A电脑装一半再应用到B电脑。放弃。

4. 量产为USBCDROM, 受硬件条件限制,有的U盘量产的CDROM不能在某些主板上启动。不好。

我这里提出一种全新的方案,使得从U盘装XP就像U盘装vista一样,或者说像是从CDROM里装XP一样。首先,在WINXP/2003下用分区工具(如hpusbfw.exe)给U盘分区并格式化好(这样格式化的分区可直接启动ntldr)。然后,把光盘上的文件全拷到U盘根目录(其实只要拷I386目录和根目录下的win51开头的文件就行了)

很多人不会设置U盘启动ntldr,在这里说一下过程:
1. 用hpusbfw.exe格式化U盘。选fat32就行了。格完取下再插上。
2. 再次用winxp自己的工具格式化成fat32。
3. 放一个ntldr文件和boot.ini文件。boot.ini中至少有两个项目,timeout设为30秒,从U盘启动,看看有没有出现boot.ini中的选单,如果有,则成功。如果没有,那就用winhex把分区第一扇区的0x40偏移处的00改为80,然后再试。如果还是不能成功,那估计碰上死硬电脑了,请看这一篇:
http://www.swigger.net/archives/56.html

 

最后,下载这个文件: usb_inst_xp1.rar            解压密码:cygwin

把文件解开把U盘根目录。(注,解开后,ntldr/boot.ini/ntdetect.com在U盘根目录,i386下增加winnt.sif和instxp文件)

好了,现在从U盘启动,会出现启动菜单,第一次选install xp,就跟光盘安装一样了,安装时可以格式化硬盘和分区,跟光盘安装全一样。 安装过程后来要求重启时,都选 run xp ondisk1。最后安装成功后还是从这个菜单项进入windows。显示全部文件包括受系统保护的文件,去除c:\boot.ini的只读属性,把C:\boot.ini里的:

multi(0)disk(0)rdisk(1)partition(1)

 改为:

multi(0)disk(0)rdisk(0)partition(1)

即把一个1改成0.

现在可以拔除U盘,从BIOS设置硬盘启动了。xp安装完毕。就跟从光盘装一样。

发表在 boot | 标签为 | 12条评论

尝试把windows xp装到移动硬盘上,一些情况

首先这个windows xp绝对不是win pe,PE就不用说了,放到U盘或移动硬盘上很容易。

试了把原版XP装到移动硬盘上,快成功了,以下是一些有意思的问题或情况:

1. 有的驱动会出问题,比如我最初在x200上实现装到移动硬盘,后来移到T43再移到台机。   移到台机发现一个有意思的蓝屏,查了一下是intelppm.sys引起的。而这个.sys是 intel cpu的驱动程序。它里面调用了rdmsr读寄存器,换成amd cpu它这一读就异常了intel 又没处理这个异常,就蓝屏了。其实它完全可以在driverentry里调用cpuid判断
   一下是不是自己的CPU,不是就return fail,这样就不会有问题了。这个驱动算是写得不好的。这个问题的解决方案就是把intelppm设为手动运行。(SYSTEM_START改为DEMAND_START)。还好CPU的驱动不重要,不装都没事。
2. 写得好点的驱动会判断设备存不存在或对不对,这就带来另一个问题,降低了win的启动速度。它很可能向设备发送一条命令,然后等待响应,可能要等到超时才发现没有设备。在移动硬盘上启动xp,启动画面可能要转9圈。比专为一套硬件安装的要慢一点。此外,在多台机器启动后安装了多个驱动,为了各处启动本身驱动要装得多,也导致变慢。不过还好,不是很慢。影响不大。

3. 2导致的另一个结果是,很多驱动启动失败(ms的驱动跟win32 services一样是以服务形式安装在注册表)。这样启动完后进入windows一看事件查看器,一堆的红叉叉。

4. 蓝屏是个很好的东西,内核发现什么不对就调用bugcheck蓝屏。这样我就可以根据它来查找和解决原因。这样蓝屏了无数次后终于实现了可在三台机器都启动。最难查的问题就是没有错误提示的东西。比如我在台机上启动后发现xp的主题出不来,窗口发白。手动在桌面右键那里修改一下就出主题了。这个问题就查不了,没有地方报错,估计只能每次这样手动调了。

5. windows好像还挺聪明的,我的移动硬盘的第一分区只剩下2G左右空间,它启动后很智能的把pagefile放到机器自带硬盘的主分区去了(即平时的C盘)。

 

发表在 boot | 留下评论

winpe进程启动顺序

想用WINPE来做点事情,深山红叶里有个很好的迷你PE盘。只有一点点文件,才几十M。

用windbg调了一下进程启动顺序,发现如下:

首先内核创建第一个用户进程 smss.exe

后来smss.exe创建 csrss.exe

再后 csrss.exe创建winlogon.exe

winlogon创建services.exe, lsass.exe , pelogon.exe等。

如下图:

smss -> csrss.exe

-> winlogon.exe -> services.exe -setup
                -> X:\WXPE\system32\lsass.exe -setup
                -> PELOGON.EXE PECMD.EXE LOAD %SystemRoot%\SYSTEM32\PECMD.INI => pecmd.exe => showdrive.exe

因为smss和csrss是native应用程序,而winlogon开始是win32子系统程序,因此,如果想要做点事的话,还是替换winlogon.exe比较好。这样编程方便。

发表在 boot | 留下评论

又被HM阴了。

晕死,经常偷偷摸摸改我的php.ini,这不几天没上又http 500 error了。

extension_dir = “/a/b/c/d/e/f” 是默认值,经常会替换我的

extension_dir = “/m/n/o/p”

另外,php5模式可以识别

extension=/m/n/o/p/gmp.so

而如果切换到 fcgi模式,那个程序笨死了,会找 /a/b/c/d/e/f//m/n/o/p/gmp.so

当然找不到,就500了。

因此要想个办法,既支持 fcgi, 又支持php5模式,做最大的兼容,达到强大的鲁棒性。

绝对路径指 定 extension已不可能,只好换成相对路径。

在我的p目录下建x目录,再在x下建y软链接指向 /m/n/o/p

这样 /m/n/o/p/x/y 与 /m/n/o/p就是一回事了,同时这样也是6层目录,与默认值一致。

把extension那句改为:

extension = ../../../../../../m/n/o/p/gmp.so

这样,不论是不是偷偷摸摸换掉我的  extension_dir 这一句,相对加载时都是先上6层目录,再从头找gmp.so。

测试了一下,fcgi模式和php5模式都兼容。

收工。

 

发表在 老当益愤 | 留下评论

在linux下,更新域内的主机名/IP映射关系

域内,windows的机器可以通过 ping直接获得IP地址。

比如,ping computerA 可以得到机器名为computerA的IP地址。

linux机器如果在域内动态分配IP地址,那么,如何根据其主机名,取得其IP地址呢?

一般情况下,配好了 hostname为xxx.test.com 的机器是自然可以这样得到IP地址的。

但如果不行的话,就有两种方案:

A. 通过nsupdate来使域内的DNS服务器更新自己的IP。

$ nsupdate
> update add xxx.test.com 9999 A 192.168.1.20
>
>quit

B. 注册自己在 WINS服务器上的名字。

这一项还没有找到现成程序,可能要自己编程解决。也许有吧,谁知道的留 言告诉我。

编程不麻烦,假设linux的IP是192.168.1.4 ,找一台windows,设IP为192.168.1.10

在linux上面运行命令

tcpdump -X -s 300 “src host 192.168.1.10”

然后在 win上,把wins服务器设为 192.168.1.4

这样,win就会去linux注册自己,看到相应的二进制包,仿照着就可以开始开发了。

当然要开发,光有二进制包还不行,可以参照着 rfc1002 先把包弄懂。rfc1001也可先看看。

弄懂后,写个程序就易于反掌了!

 

顺便说一下,在dns上注册名字后,windows 可能还不能马上ping到,ping会报告找不到名字。这是因为windows有缓存。可以用下面这条命令手动清掉windows的DNS缓存(DNS Cache)。

ipconfig /flushdns

 

 

发表在 linux | 留下评论

U盘启动小结

现在的U盘都比较大了,所以ZIP模式和HDD模式已经不太重要了,可以忽略了。

本文只说  USB-CD模式和USB-HDD模式。

USB-CD 模式是比较不错的一个方式,可惜对硬件有一定要求。现在我们去买U盘的时候,能买到一些U盘带有一些特殊的功能,比如杀毒功能。这种U盘插入电脑后,会多出两个盘符,一个是光盘,里面放的是实现这些特殊功能的软件,还有一个就是移动盘符,也就是给用户使用的U盘存储了。

那么,这个光盘是怎么出来的呢?实际上,每个U盘都可以这样造出光盘来,用量产工具就可以了,量产工具可以在这里找到:

http://bbs.mydigit.cn/read.php?tid=20620

不过,这样生产出来的光盘,不一定能用来启动。这跟BIOS有关系,一个U盘上同时有光盘和移动存储时,可能有两种情况。情况A:光盘在前面,移动存储在后面。情况B:移动存储在前,光盘在后。

如果碰到情况B,问题不太好办。有的主板只认第一个东西。比如IBM笔记本,我的T43和刚买的X200,BIOS都不支持这种状况。碰到情况A就比较好了。遗憾的是,这个A和B不是自己能选的,量产工具并不支持调整,所以,只能买不同芯片的U盘来达到这一目的。目前我用过的,只有iCreate的芯片的量产工具是支持情况A的。有了这样的U盘后,量产一下,只要主板支持USB-CD,就什么ISO都能拿来启动了。

小结一下步骤:

  1. 确定U盘的量产工具
  2. 量产放入一个支持启动的ISO。
  3. 改BIOS从USB-CD启动,实验。如果主板支持情况B,则什么U盘都能启动。
  4. 如果主板不支持情况B,就只能去找个别的芯片的U盘了,比如找个iCreate芯片的。然后重新从2试。

另一模式是USB-HDD模式。对于U盘,如果量产时设置成移动型,那么windows在格式化时,不会生成分区表,不会有MBR,这样主板是不认识也不能启动的。可以在linux下fdisk,可以生成MBR和分区表。当然,不用linux的话,下载一个HPUSBFW.exe格式化一下,也有MBR和分区表了。不过用hpusbfw格式化后,最好再用XP自己格一下,这样生成的分区就肯定支持启动微软自家的NTLDR了。启动了NTLDR其它都好办了。不过整完后,还需要用winhex改一下,把分区改为活动的,可以用winhex打开整个设备,改一下0x1be处,把00改为80。还需要改一下分区,用winhex打开格式化后的分区,把0x40处从00改为80。这样后,把C盘的NTLDR,NTDETECT.com,boot.ini放过去,就可以实验一下支持启动的感觉了。

小结一下步骤:

  1. 用HPUSBFW.exe格式化U盘为FAT32格式。假设完成后有M盘。
  2. 用XP自己格一下M盘,确保启动代码更适合微软的NTLDR。
  3. 用Winhex的打开磁盘功能,打开物理设备(physical media)下的U盘,改0x1be处,从00改为80。
  4. 用winhex的打开磁盘功能,打开逻辑驱动器M盘,把0x40处从00改为80。(注:如果不是FAT/FAT32这样做就损坏数据了)
  5. 此U盘已经能以USB-HDD形式启动,可以放入C盘下的ntldr,ntdetect.com,boot.ini去试验。试验时确保boot.ini具有多项,且等待时间较长,这样就能看到选择启动的画面,从而确定此U盘已经确实能支持启动。
发表在 boot | 一条评论