This article will also be published in english:
身为IT有时候要从user的outlook profile中抓取一些信息,如PST的名字,存放位置什么的。此为前提。
用outlook的com object写一些命令或脚本当然可以很轻松做得到,但是执行效率略低是一方面,对com object的使用又是另一方面。
而且com object只能从本地端user登陆过后来执行,因为user的outlook profile是存放于HKEY_CURRENT_USER这个键当中,其他用户自然也就无法加载该user的profile然后用com object接口读到相应的信息。
实际上这种需求直接分析注册表是最为简单,从后台也可以偷摸做。对注册表做一些遍历或者是分析,因此从效率上来说应该是更加快速的。
outlook的profile在注表中的位置如下,
HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles
当然,打开之后其实是相当不友好的,如下图,
观察一下就能发现,都是16进制 - 0到9 a-f,其实它们是给MAPI方便调用的,对用户或者说非这方面专家来说是很不友好的。
但是,它们中某些数据的确能够抓到我们最开始提及的PST文件的信息,我们需要的就是分析这些16进制的字符串,
经过一些总结后,这些16进制键中,部分是随机生成,部分是固定通用的,根据一些分析下面的几个键应该是通用的,后面也括包括了它们的作用,这里本人水平有限,没有研读MSDN的资料(又不搞这方面开发,读个球球呀),于是浅显地自己实际试验了一下,得出以下结果。
f86ed2903a4a11cfb57e524153480001 删掉后无异常,也未自动生成
9207f3e0a3b11019908b08002b2a56c2 providers
9375CFF0413111d3B88A00104B2A6676 Signature
8503020000000000c000000000000046 不可删除,需要有value 0102300b,否则报错,具体作用不明
5acf76a3665511cea39a00aa004acafa 删掉后无异常,也未自动生成
3517490d76624c419a828607e2a54604 删掉后无异常,会自动生成
13dbb0c8aa05101a9bb000aa002fc45a 和outlook anywhere有关
0a0d020000000000c000000000000046 outlook最近使用的一些配置
{D9734F19-8CFB-411D-BC59-833E334FCB5E} 删掉后无异常,会自动生成
PST文件的路径呢,其实就在providers所在的键值中,如下图,PST和其它的mailbox等,都存在一个01023d00的value中。
这个value打开之后,它的data全都是16进制的单字节,下面是一些特性,
1. 每两行为一组,可以刚好分为一组或多组,也就是说,总的字结数,肯定是16的倍数。
2. 每两行合并成一个16进制字符串,该字符串其实就是profile的一个subkey。
3. 每个从第2步合成的字符串上来说,都是一个provider,说白了就是我们在outlook上看到的mailboxes或者是挂载的PST,如下图,
像我这种有节操的运维,当然公司的一些信息我要打码,能看明白就行了,
上面说了3点,其实用一张图能更明白表达我想说的是什么(咦!~感觉前面3点白说了),
一看就懂了,是吧,下面我们打开F67F21B*****这个key来看一下里面的内容,其中有一个叫001f3001的value,它的data如图,说明了这个provider是一个PST文件,那它的路径在哪呢?在001f6700这个value里放着,请看下图,
providers的value里,包括了很多mailbox或者挂载的PST,还有public folder之类一般看不到的folder,一切都是按上面PST的方法一样,能够读出来。
现在有个问题,其它的一些value代表了什么?又是怎么知道01023d00这个value存着providers的?其它还有很多key是干嘛用的?
关于这几个问题,我自认水平糙,智商不高加上先天缺陷,无法一一解答,贴一个MSDN链好了。
http://msdn.microsoft.com/en-us/library/bb415650.aspx
还有另一个在网上找到的站点,信息已经过时,而且是德文(Google翻译告诉我的),但依然有一定参考价值,
http://www.msxfaq.de/clients/mapireg.htm
那捕获PST的脚本有么?遗憾,没有,因为是某BBS里有人提到过怎么从注册表里找PST的问题,我才研究了一下,本身我没有该需求,也就没有编写任何的script。