windows运行命令详解
winver---------检查Windows版本
wmimgmt.msc----打开windows管理体系结构(WMI)
wupdmgr--------windows更新程序
wscript--------windows脚本宿主设置
write----------写字板
winmsd---------系统信息
wiaacmgr-------扫描仪和照相机向导
winchat--------XP自带局域网聊天
mem.exe--------显示内存使用情况
Msconfig.exe---系统配置实用程序
mplayer2-------简易widnows media player
mspaint--------画图板
mstsc----------远程桌面连接
mplayer2-------媒体播放机
magnify--------放大镜实用程序
mmc------------打开控制台
mobsync--------同步命令
dxdiag---------检查DirectX信息
drwtsn32------ 系统医生
devmgmt.msc--- 设备管理器
dfrg.msc-------磁盘碎片整理程序
diskmgmt.msc---磁盘管理实用程序
dcomcnfg-------打开系统组件服务
ddeshare-------打开DDE共享设置
dvdplay--------DVD播放器
net stop messenger-----停止信使服务
net start messenger----开始信使服务
notepad--------打开记事本
nslookup-------网络管理的工具向导
ntbackup-------系统备份和还原
narrator-------屏幕“讲述人”
ntmsmgr.msc----移动存储管理器
ntmsoprq.msc---移动存储管理员操作请求
netstat -an----(TC)命令检查接口
syncapp--------创建一个公文包
sysedit--------系统配置编辑器
sigverif-------文件签名验证程序
sndrec32-------录音机
shrpubw--------创建共享文件夹
secpol.msc-----本地安全策略
syskey---------系统加密,一旦加密就不能解开,保护windows xp系统的双重密码
services.msc---本地服务设置
Sndvol32-------音量控制程序
sfc.exe--------系统文件检查器
sfc /scannow---windows文件保护
tsshutdn-------60秒倒计时关机命令
tourstart------xp简介(安装完成后出现的漫游xp程序)
taskmgr--------任务管理器
eventvwr-------事件查看器
eudcedit-------造字程序
explorer-------打开资源管理器
packager-------对象包装程序
perfmon.msc----计算机性能监测程序
progman--------程序管理器
regedit.exe----注册表
rsop.msc-------组策略结果集
regedt32-------注册表编辑器
rononce -p ----15秒关机
regsvr32 /u *.dll----停止dll文件运行
regsvr32 /u zipfldr.dll------取消ZIP支持
cmd.exe--------CMD命令提示符
chkdsk.exe-----Chkdsk磁盘检查
certmgr.msc----证书管理实用程序
calc-----------启动计算器
charmap--------启动字符映射表
cliconfg-------SQL SERVER 客户端网络实用程序
Clipbrd--------剪贴板查看器
conf-----------启动netmeeting
compmgmt.msc---计算机管理
cleanmgr-------垃圾整理
ciadv.msc------索引服务程序
osk------------打开屏幕键盘
odbcad32-------ODBC数据源管理器
oobe/msoobe /a----检查XP是否激活
lusrmgr.msc----本机用户和组
logoff---------注销命令
iexpress-------木马捆绑工具,系统自带
Nslookup-------IP地址侦测器
fsmgmt.msc-----共享文件夹管理器
utilman--------辅助工具管理器
gpedit.msc-----组策略
posted @
2006-05-25 01:08 Jerry Cat 阅读(453) |
评论 (0) |
编辑 收藏
[转]使用Shell API读取"特殊"路径设置
最近编码,在取用户文档数据目录时,遇到问题:
我的做法是:<系统盘> + "\Documents and Settings\" + <用户名> + "\Application Data\"
为啥这么麻烦,因为当时我没有找到合适的API,有什么问题呢?
问题出在用户名,假如我的用户名是Stone,但文档数据目录却有可能存在两种,一是:Stone,
还有可能是 Stone.域名。但实际上Stone都是域用户。出现此情况的原因不明。而取用户名的函数用
的是 GetUserName(也试过其它),域名当然也可以取出,但何时带域名,何时不带域名的规律不得而
知。
所以,还是只能去查到API,其实Windows Shell API有此类函数,只不过使用比较特殊。
代码如下:
LPITEMIDLIST pidl;
SHGetSpecialFolderLocation(NULL,CSIDL_APPDATA,&pidl);
if ( pidl ) {
TCHAR szPathName[1024];
SHGetPathFromIDList(pidl,szPathName);
LPMALLOC pMalloc;
SHGetMalloc( &pMalloc );
pMalloc->Free(pidl);
}
更换其中参数CSIDL_APPDATA,可以得到很多的系统设置值。用此方法,将前文所讲的判定给了
API,不再有问题。
posted @
2006-05-25 00:10 Jerry Cat 阅读(739) |
评论 (0) |
编辑 收藏
MFC下的文件类
转自
http://www.cppblog.com/RancyGe/archive/2006/05/22/7496.html
1、文件操作的方法
使用Visual C++编程,有如下方法进行文件操作:
(1)使用标准C运行库函数,包括fopen、fclose、fseek等。
(2)使用Win16下的文件和目录操作函数,如lopen、lclose、lseek等。不过,在Win32下,这些函数主要是为了和Win16向后兼容。
(3)使用Win32下的文件和目录操作函数,如CreateFile,CopyFile,DeleteFile,FindNextFile,等等。
Win32下,打开和创建文件都由CreateFile完成,成功的话,得到一个Win32下的句柄,这不同于“C”的fopen返回的句柄。在Win16下,该句柄和C运行库文件操作函数相容。但在Win32下,“C”的文件操作函数不能使用该句柄,如果需要的话,可以使用函数_open_osfhandle从Win32句柄得到一个“C”文件函数可以使用的文件句柄。 关闭文件使用Win32的CloseHandle。 在Win32下,CreateFile可以操作的对象除了磁盘文件外,还包括设备文件如通讯端口、管道、控制台输入、邮件槽等等。
(4)使用CFile和其派生类进行文件操作。CFile从CObject派生,其派生类包括操作文本文件的CStdioFile,操作内存文件的CmemFile,等等。CFile是建立在Win32的文件操作体系的基础上,它封装了部分Win32文件操作函数。最好是使用CFile类(或派生类)的对象来操作文件,必要的话,可以从这些类派生自己的文件操作类。统一使用CFile的界面可以得到好的移植性。
2、文件操作的方法
MFC用一些类来封装文件访问的Win32 API。以CFile为基础,从CFile派生出几个类,如CStdioFile,CMemFile,MFC内部使用的CMiororFile,等等。
2.1、CFile的结构
2.1.1、CFile定义的枚举类型
CFile类定义了一些和文件操作相关的枚举类型,主要有四种:OpenFlags,Attribute,SeekPosition,hFileNull。下面,分别解释这些枚举类型。
OpenFlags
OpenFlags定义了13种文件访问和共享模式:
enum OpenFlags {
//第一(从右,下同)至第二位,打开文件时访问模式,读/写/读写
modeRead = 0x0000,
modeWrite = 0x0001,
modeReadWrite = 0x0002,
shareCompat = 0x0000, //32位MFC中没用
//第五到第七位,打开文件时的共享模式
shareExclusive = 0x0010,//独占方式,禁止其他进程读写
shareDenyWrite = 0x0020,//禁止其他进程写
shareDenyRead = 0x0030,//禁止其他进程读
shareDenyNone = 0x0040,//允许其他进程写
//第八位,打开文件时的文件继承方式
modeNoInherit = 0x0080,//不允许子进程继承
//第十三、十四位,是否创建新文件和创建方式
modeCreate = 0x1000,//创建新文件,文件长度0
modeNoTruncate = 0x2000,//创建新文件时如文件已存在则打开
//第十五、十六位,文件以二进制或者文本方式打开,在派生类CStdioFile中用
typeText = 0x4000,
typeBinary = (int)0x8000
};
Attribute
Attribute定义了文件属性:正常、只读、隐含、系统文件,文件或者目录等。
enum Attribute {
normal = 0x00,
readOnly = 0x01,
hidden = 0x02,
system = 0x04,
volume = 0x08,
directory = 0x10,
archive = 0x20
}
SeekPosition
SeekPosition定义了三种文件位置:头、尾、当前:
enum SeekPosition{
begin = 0x0,
current = 0x1,
end = 0x2
};
hFileNull
hFileNull定义了空文件句柄
enum { hFileNull = -1 };
2.1.2、CFile的其他一些成员变量
CFile除了定义枚举类型,还定义了一些成员变量。例如:
UINT m_hFile
该成员变量是public访问属性,保存::CreateFile返回的操作系统的文件句柄。MFC重载了运算符号HFILE来返回m_hFile,这样在使用HFILE类型变量的地方可以使用CFile对象。
BOOL m_bCloseOnDelete;
CString m_strFileName;
这两个成员变量是protected访问属性。m_bCloseOnDelete用来指示是否在关闭文件时删除CFile对象;m_strFileName用来保存文件名。
2.1.3、CFile的成员函数
CFile的成员函数实现了对Win32文件操作函数的封装,完成以下动作:打开、创建、关闭文件,文件指针定位,文件的锁定与解锁,文件状态的读取和修改,等等。其中,用到了m_hFile文件句柄的一般是虚拟函数,和此无关的一般是静态成员函数。一般地,成员函数被映射到对应的Win32函数,如表11-1所示。
表11-1 CFile函数对Win32文件函数的封装
虚拟
|
静态
|
成员函数
|
对应的Win32函数
|
文件的创建、打开、关闭
|
√
|
|
Abort
|
CloseHandle
|
√
|
|
Duplicate
|
DuplicateHandle
|
√
|
|
Open
|
CreateFile
|
√
|
|
Close
|
CloseHandle
|
文件的读写
|
√
|
|
Read
|
ReadFile
|
|
|
ReadHuge(向后兼容)
|
调用Read成员函数
|
√
|
|
Write
|
WriteFile
|
|
|
WriteHuage(向后兼容)
|
调用Write成员函数
|
√
|
|
Flush
|
FlushFileBuffers
|
文件定位
|
√
|
|
Seek
|
SetFilePointer
|
|
|
SeekToBegin
|
调用Seek成员函数
|
|
|
SeekToEnd
|
调用Seek成员函数
|
√
|
|
GetLength
|
调用Seek成员函数
|
√
|
|
SetLength
|
SetEndOfFile
|
文件的锁定/解锁
|
√
|
|
LockRange
|
LockFile
|
√
|
|
UnlockRange
|
UnlockFile
|
文件状态操作函数
|
√
|
|
GetPosition
|
SetFilePointer
|
|
|
GetStatus(CFileStatus&)
|
GetFileTime,GetFileSize等
|
|
√
|
GetStatus(LPSTR lpszFileName CFileStatus&)
|
FindFirstFile
|
√
|
|
GetFileName
|
不是简单地映射到某个函数
|
√
|
|
GetFileTitle
|
|
√
|
|
GetFilePath
|
|
√
|
|
SetFilePath
|
|
|
√
|
SetStatus
|
|
改名和删除
|
|
√
|
Rename
|
MoveFile
|
|
√
|
Remove
|
DeleteFile
|
2.1.4、CFile的部分实现
这里主要讨论CFile对象的构造函数和文件的打开/创建的过程。
构造函数
CFile有如下几个构造函数:
CFile()
缺省构造函数,仅仅构造一个CFile对象,还必须使用Open成员函数来打开文件。
CFile(int hFile)
已经打开了一个文件hFile,在此基础上构造一个CFile对象来给它打包。HFile将被赋值给CFile的成员变量m_hFile。
CFile(LPCTSTR lpszFileName, UINT nOpenFlags)
指定一个文件名和文件打开方式,构造CFile对象,调用Open打开/创建文件,把文件句柄保存到m_hFile。
打开/创建文件
Open的原型如下:
BOOL CFile::Open(LPCTSTR lpszFileName, UINT nOpenFlags,
CFileException* pException)
Open调用Win32函数::CreateFile打开文件,并把文件句柄保存到成员变量m_hFile中。
CreateFile函数的原型如下:
HANDLE CreateFile(
LPCTSTR lpFileName, // pointer to name of the file
DWORD dwDesiredAccess,// access (read-write) mode
DWORD dwShareMode, // share mode
LPSECURITY_ATTRIBUTES lpSecurityAttributes, //pointer to security descriptor
DWORD dwCreationDistribution,// how to create
DWORD dwFlagsAndAttributes, // file attributes
HANDLE hTemplateFile // handle to file with attributes to copy
);
显然,Open必须把自己的两个参数lpszFileName和nOpenFlags映射到CreateFile的七个参数上。
从OpenFlags的定义可以看出,(nOpenFlags & 3)表示了读写标识,映射成变量dwAccess,可以取值为Win32的GENERIC_READ、GENERIC_WRITE、GENERIC_READ|GENERIC_WRITE。
(nOpenFlags & 0x70)表示了共享模式,映射成变量dwShareMode,可以取值为Win32的FILE_SHARE_READ、FILE_SHARE_WRITE、FILE_SHARE_WRITE|FILE_SHARE_READ。
Open定义了一个局部的SECURITY_ATTRIBUTES变量sa,(nOpenFlags & 0x80)被赋值给sa.bInheritHandle。
(nOpenFlags & modeCreate)表示了创建方式,映射成变量dwCreateFlag,可以取值为Win32的OPEN_ALWAYS、CREATE_ALWAYS、OPEN_EXISTING。
在生成了上述参数之后,先调用::CreateFile:
HANDLE hFile =::CreateFile(lpszFileName,
dwAccess, dwShareMode, &sa,
dwCreateFlag, FILE_ATTRIBUTE_NORMAL, NULL);
然后,hFile被赋值给成员变量m_hFile,m_bCloseOnDelete被设置为TRUE。
由上可以看出,CFile打开(创建)一个文件时大大简化了:: CreateFile函数的复杂性,即只需要指定一个文件名、一个打开文件的参数即可。若该参数指定为0,则表示以只读方式打开一个存在的文件,独占使用,不允许子进程继承。
在CFile对象使用时,如果它是在堆中分配的,则应该销毁它;如果在栈中分配的,则CFile对象将被自动销毁。销毁时析构函数被调用,析构函数是虚拟函数。若m_bCloseOnDelete为真且m_hFile非空,则析构函数调用Close关闭文件。
至于其他CFile成员函数的实现,这里不作分析了。
2.1.5、CFile的派生类
这里主要简要地介绍CStdioFile和CmemFile及CFileFind。
CStdioFile
CStdioFile对文本文件进行操作。
CStdioFile定义了新的成员变量m_pStream,类型是FILE*。在打开或者创建文件时,使用_open_osfhandle从m_hFile(Win32文件句柄)得到一个“C”的FILE类型的文件指针,然后,在文件操作中,使用“C”的文件操作函数。例如,读文件使用_fread,而不是::ReadFile,写文件使用了_fwrite,而不是::WriteFile,等等。m_hFile是CFile的成员变量。
另外,CStdioFile不支持CFile的Dumplicate、LockRange、UnlockRange操作,但是实现了两个新的操作ReadString和WriteString。
CMemFile
CMemFile把一块内存当作一个文件来操作,所以,它没有打开文件的操作,而是设计了Attach和Detach用来分配或者释放一块内存。相应地,它提供了Alloc、Free虚拟函数来操作内存文件,它覆盖了Read、Write来读写内存文件。
CFileFind
为了方便文件查找,MFC把有关功能归结成为一个类CFileFind。CFileFind派生于CObject类。首先,它使用FindFile和FineNextFile包装了Win32函数::FindFirstFile和::FindNextFile;其次,它提供了许多函数用来获取文件的状态或者属性。
使用CFileStatus结构来描述文件的属性,其定义如下:
struct CFileStatus
{
CTime m_ctime; // 文件创建时间
CTime m_mtime; // 文件最近一次修改时间
CTime m_atime; // 文件最近一次访问时间
LONG m_size; // 文件大小
BYTE m_attribute; // 文件属性
BYTE _m_padding; // 没有实际含义,用来增加一个字节
TCHAR m_szFullName[_MAX_PATH]; //绝对路径
#ifdef _DEBUG
//实现Dump虚拟函数,输出文件属性
void Dump(CDumpContext& dc) const;
#endif
};
例如:
CFileStatus status;
pFile->GetStatus(status);
#ifdef _DEBUG
status.dump(afxDump);
#endif
posted @
2006-05-23 21:17 Jerry Cat 阅读(729) |
评论 (1) |
编辑 收藏
static_cast<>揭密
作者:Sam NG
译者:
小刀人
原文链接:
What static_cast<> is actually doing
本文讨论static_cast<> 和 reinterpret_cast<>。
介绍
大多程序员在学C++前都学过C,并且习惯于C风格(类型)转换。当写C++(程序)时,有时候我们在使用static_cast<>和reinterpret_cast<>时可能会有点模糊。在本文中,我将说明static_cast<>实际上做了什么,并且指出一些将会导致错误的情况。
泛型(Generic Types)
float f = 12.3;
float* pf = &f;
// static cast<>
// 成功编译, n = 12
int n = static_cast<int>(f);
// 错误,指向的类型是无关的(译注:即指针变量pf是float类型,现在要被转换为int类型)
//int* pn = static_cast<int*>(pf);
//成功编译
void* pv = static_cast<void*>(pf);
//成功编译, 但是 *pn2是无意义的内存(rubbish)
int* pn2 = static_cast<int*>(pv);// reinterpret_cast<>
//错误,编译器知道你应该调用static_cast<>
//int i = reinterpret_cast<int>(f);
//成功编译, 但是 *pn 实际上是无意义的内存,和 *pn2一样
int* pi = reinterpret_cast<int*>(pf);
简而言之,static_cast<> 将尝试转换,举例来说,如float-到-integer,而reinterpret_cast<>简单改变编译器的意图重新考虑那个对象作为另一类型。
指针类型(Pointer Types)
指针转换有点复杂,我们将在本文的剩余部分使用下面的类:
class CBaseX
{
public:
int x;
CBaseX() { x = 10; }
void foo() { printf("CBaseX::foo() x=%d\n", x); }
};
class CBaseY
{
public:
int y;
int* py;
CBaseY() { y = 20; py = &y; }
void bar() { printf("CBaseY::bar() y=%d, *py=%d\n", y, *py);
}
};class CDerived : public CBaseX, public CBaseY
{
public:
int z;
};
情况1:两个无关的类之间的转换
// Convert between CBaseX* and CBaseY*
// CBaseX* 和 CBaseY*之间的转换
CBaseX* pX = new CBaseX();
// Error, types pointed to are unrelated
// 错误, 类型指向是无关的
// CBaseY* pY1 = static_cast<CBaseY*>(pX);
// Compile OK, but pY2 is not CBaseX
// 成功编译, 但是 pY2 不是CBaseX
CBaseY* pY2 = reinterpret_cast<CBaseY*>(pX);
// System crash!!
// 系统崩溃!!
// pY2->bar();
正如我们在泛型例子中所认识到的,如果你尝试转换一个对象到另一个无关的类static_cast<>将失败,而reinterpret_cast<>就总是成功“欺骗”编译器:那个对象就是那个无关类。
情况2:转换到相关的类
1. CDerived* pD = new CDerived();
2. printf("CDerived* pD = %x\n", (int)pD);
3.
4. // static_cast<> CDerived* -> CBaseY* -> CDerived*
//成功编译,隐式static_cast<>转换
5. CBaseY* pY1 = pD;
6. printf("CBaseY* pY1 = %x\n", (int)pY1);
// 成功编译, 现在 pD1 = pD
7. CDerived* pD1 = static_cast<CDerived*>(pY1);
8. printf("CDerived* pD1 = %x\n", (int)pD1);
9.
10. // reinterpret_cast
// 成功编译, 但是 pY2 不是 CBaseY*
11. CBaseY* pY2 = reinterpret_cast<CBaseY*>(pD);
12. printf("CBaseY* pY2 = %x\n", (int)pY2);
13.
14. // 无关的 static_cast<>
15. CBaseY* pY3 = new CBaseY();
16. printf("CBaseY* pY3 = %x\n", (int)pY3);
// 成功编译,尽管 pY3 只是一个 "新 CBaseY()"
17. CDerived* pD3 = static_cast<CDerived*>(pY3);
18. printf("CDerived* pD3 = %x\n", (int)pD3);
---------------------- 输出 ---------------------------
CDerived* pD = 392fb8
CBaseY* pY1 = 392fbc
CDerived* pD1 = 392fb8
CBaseY* pY2 = 392fb8
CBaseY* pY3 = 390ff0
CDerived* pD3 = 390fec
注意:在将CDerived*用隐式 static_cast<>转换到CBaseY*(第5行)时,结果是(指向)CDerived*(的指针向后) 偏移了4(个字节)(译注:4为int类型在内存中所占字节数)。为了知道static_cast<> 实际如何,我们不得不要来看一下CDerived的内存布局。
CDerived的内存布局(Memory Layout)
如图所示,CDerived的内存布局包括两个对象,CBaseX 和 CBaseY,编译器也知道这一点。因此,当你将CDerived* 转换到 CBaseY*时,它给指针添加4个字节,同时当你将CBaseY*转换到CDerived*时,它给指针减去4。然而,甚至它即便不是一个CDerived你也可以这样做。
当然,这个问题只在如果你做了多继承时发生。在你将CDerived转换 到 CBaseX时static_cast<> 和 reinterpret_cast<>是没有区别的。
情况3:void*之间的向前和向后转换
因为任何指针可以被转换到void*,而void*可以被向后转换到任何指针(对于static_cast<> 和 reinterpret_cast<>转换都可以这样做),如果没有小心处理的话错误可能发生。
CDerived* pD = new CDerived();
printf("CDerived* pD = %x\n", (int)pD);
CBaseY* pY = pD; // 成功编译, pY = pD + 4
printf("CBaseY* pY = %x\n", (int)pY);
void* pV1 = pY; //成功编译, pV1 = pY
printf("void* pV1 = %x\n", (int)pV1);
// pD2 = pY, 但是我们预期 pD2 = pY - 4
CDerived* pD2 = static_cast<CDerived*>(pV1);
printf("CDerived* pD2 = %x\n", (int)pD2);
// 系统崩溃
// pD2->bar();
---------------------- 输出 ---------------------------
CDerived* pD = 392fb8
CBaseY* pY = 392fbc
void* pV1 = 392fbc
CDerived* pD2 = 392fbc
一旦我们已经转换指针为void*,我们就不能轻易将其转换回原类。在上面的例子中,从一个void* 返回CDerived*的唯一方法是将其转换为CBaseY*然后再转换为CDerived*。
但是如果我们不能确定它是CBaseY* 还是 CDerived*,这时我们不得不用dynamic_cast<> 或typeid[2]。
注释:
1. dynamic_cast<>,从另一方面来说,可以防止一个泛型CBaseY* 被转换到CDerived*。
2. dynamic_cast<>需要类成为多态,即包括“虚”函数,并因此而不能成为void*。
参考:
1. [MSDN] C++ Language Reference -- Casting
2. Nishant Sivakumar, Casting Basics - Use C++ casts in your VC++.NET programs
3. Juan Soulie, C++ Language Tutorial: Type Casting
posted @
2006-05-23 01:45 Jerry Cat 阅读(402) |
评论 (0) |
编辑 收藏
WINXP服务详解
1.Alerter
Alerter(警示器)服务的进程名是 Services.exe(即启动这个服务后在后台运行的进程的名称,可以通过任务管理器看到)。Alerter服务的功能是,WinXP将系统上发生的 与管理有关的事件以警示(Alert)信息传送至网络上指定的电脑或用户,例如当发生打印错误或硬盘即将写满等事件,这类警示信息由XP的警示器服务 (Alerter Service)收集、送出。
尽管Alerter依存的服务并没有Messenger(信使)服务,但Alerter服 务必须依赖后者才能送出信息,故在启动Alerter服务后还必须确定Messenger服务也是在工作中,而接收的电脑也必须启动Messenger服 务。由于Alerter服务运行后,服务使用户可以发送弹出(Pop-up)信息给其他用户,这些信息有可能被攻击者用来实施攻击,如诱骗用户修改口令 等,从而造成安全隐患。同时该服务使得用户帐号名泄漏,也有可能被攻击者利用来进行口令猜测攻击。所以对于家庭单机用户,甚至对于绝大多数小型的局域网来 说,这个功能是完全可禁用的,不仅节省了系统资源和加快启动速度,也提高了机器的安全性。
2.Application Layer Gateway Service
简称"ALG"(应用层网关),其进程名是alg.exe,WinXP Home/PRO默认安装的启动类型为手动。ALG又被称为代理服务器(Proxy Server),是网络防火墙从功能面上分类的一种。当内部计算机与外部主机连结时,将由代理服务器(Proxy Server)担任内部计算机与外部主机的连结中继者。使用ALG的好处是隐藏内部主机的地址和防止外部不正常的连接,如果代理服务器上未安装针对该应用 程序设计的代理程序时,任何属于这个网络服务的封包将完全无法通过防火墙。通俗点说,具体到ALG本身,它就是WinXP附带的Internet连接共享 /防火墙的具体控管程序,如果你需要启用这二者,这个服务是必备的。当然,只有一台计算机的上网家庭可以考虑禁用这个服务,不过笔者个人觉得WinXP内 置的防火墙效果还是不错的,如果不是坚持要使用第三方的防火墙,还是建议开着它吧。
3.Application Management
AppMgmt (应用程序管理服务)的进程名是Svchost.exe,WinXP Home/Pro默认安装的启动类型是手动,没有任何依存服务关系。从Win2000开始微软引入了一种基于MSI文件格式(应用程序安装信息程序包文 件)的全新、有效软件管理方案——即应用程序管理组件服务(Application Management),它不仅管理软件的安装、删除,而且可使用此项服务修改、修复现有应用程序,监视文件复原并通过复原排除基本故障等。通常这个服务 我们保持其默认状态较好。
可能许多朋友都有印象,当年ACDSee 4.0刚发布时,由于安装制作上的考虑不周,并没有考虑到那个时候大多数人的系统还并不支持MSI安装格式,结果只得又去下载安装一个名为Windows Installer的MSI辅助文件才解决问题。通常以MSI文件格式安装的软件十分好认,比如说Office XP,当你安装后再次运行软件的安装程序时,它一般会有"重新安装"、"修复软件"、"卸载软件"等多个选项,而不是以前安装程序那种就简单的卸载或覆盖 安装了事。
4.Automatic Updates
Wuauserv(自动更新服务)的进程名是Svchost.exe,WinXP Home/Pro默认安装的启动类型为自动,没有任何依存服务关系。这个是大家都非常熟悉的系统自动更新功能,就不多说了。用小猫上网而深受其苦的朋友记 得在系统属性中关闭是不够的,还要将Automatic Updates这个服务禁用才可以。以后需要更新的话,直接到在IE中键入Windows Update 网站地址手动更新即可。
5.Background Intelligent Transfer Service
BITS(后台智能传输服务)的进程名是Svchost.exe,WinXP Home/Pro默认安装的启动类型是手动,依赖于Remote Procedure Call、Workstation服务。微软宣称BITS能够利用剩余的带宽传输文件,当网络切断或计算机需重启时,后台智能传输服务会自动对文件传输加 以维护,当网络重新连接时,后台智能传输服务将继续从停止的地方继续开始传输文件。其实这个服务原是用来实现HTTP 1.1服务器之间的信息传输,基本上它的应用也就是支持Windows自动更新时的断点续传。如果你禁用了Automatic Updates,留着它基本上也没有什么意义。
6.ClipBook
ClipSrv(剪贴板查看器服务)的进程名是 clipsrv.exe,WinXP Home/Pro默认安装的启动类型是手动,依赖Network DDE服务。ClipBook通过Network DDE和Network DDE DSDM提供的网络动态数据交换服务,可查阅远程机器中的剪贴板,通俗的说就是ClipBook支持剪贴板查看器(ClipBook Viewer)程序,该程序可允许剪贴页被远程计算机上的ClipBook浏览。
例如有个较大的文档工程,由A、B、C共同开发,A负责 Excel数据部分,B负责Visio制图部分,而C负责将两部分文档的整合。C经常需要对A、B的数据进行拷贝,愚蠢的做法是C打开A、B在网络邻居上 共享的文档,然后将相关内容拷贝。而对Windows体系有一定了解的用户应该听说过OLE这个东西,上面说的EXCEL数据和Visio制图都可以认为 是独立的OLE对象,如果A、B、C的3台机器上的Clipbook服务都为开启,就可利用ClipBook共享这些OLE对象,C只要在自己的文档中建 立OLE对象的链接指向A、B的Excel和Visio,A、B对自己工作的任何改动即可在C的复合文档里自动体现。由此可见,ClipBook是基于对 象的共享,而非简单的文件共享。所以也很好理解,这是一把双刃剑,在带来极大方便的同时,也带来被非法远程访问ClipBook剪贴页面的安全隐患。对于 没有上述类似工作,又不准备使用或极少使用远程桌面的用户,这个服务完全可以禁用,在需要的时候再打开。
7.COM+ Event System
EventSystem (COM+事件系统服务)的进程名是Svchost.exe,WinXP Home/Pro默认安装的启动类型是手动,依赖Remote Procedure Call服务。对于非软件开发专业的朋友来说,COM+是个非常难理解的名词。简单的说COM+是一种软件构件/组件的标准。比如写一个软件好比是盖一座 房子。而门窗等部件会根据标准设计,以求得省时省力,COM组件即是Windows的门窗等标准组件了,COM+是对COM的进一步扩展,其具体含义在此 就不详细介绍了,Windows系统又是个典型的消息(事件)处理型系统,很多功能都是由消息来触发的,这就产生了COM+ Event System。我们要学习的是如何简单判断自己的系统中是否有程序依靠此服务。检查你的系统安装盘下的"Program files\ComPlus Applications "目录,如果没有东西就可以把这个服务关闭了。
8.COM+ System Application
COMSysApp(COM+系统应用服务)的进程名是Dllhost.exe,WinXP Home/Pro默认安装的启动类型是手动,依赖Remote Procedure Call服务。简单的说,COM+ System Application是COM+ Event System的具体执行者,如果禁用了COM+ Event System也就自然禁用它。
9.Computer Browser
Browser(计算机浏览器服务)的进程名是Svchost.exe,WinXP Home/Pro默认安装的启动类型是自动,依赖Server和Workstation服务。Browser服务维护着一个网络资源的清单,其中包括基于 Windows的域、工作组和计算机,还有其他支持NetBIOS协议的网络设备,我们在"网上邻居"上看到显示的内容正是来源于此。显然对于一般家庭用 的计算机这个服务并不需要,除非计算机位于局域网之上,例如用长城宽带的朋友,用它可方便地知道社区内的网络环境。这个服务还是慎重对待较好,若不是太在 意还是将其设置成自动吧。
10.Cryptographic services
CryptSvc(认证服务)的进程名是 Svchost.exe,WinXP Home/Pro默认安装的启动类型为自动,依赖Remote Procedure Call服务。CryptSvc是整个微软公钥体系(PKI,Public Key Infrastructure)的核心元件。所谓的PK是一种公匙加密法,通过加密来保证数据的安全和传送,它与传统的秘密(对称)钥匙密码法不相同, PK密码法的基本特性是加密和解密的钥匙不同,每一个用户两把钥匙,一把公开密匙,一把私匙。撇开这些难以一下子理解的术语,具体到CryptSvc本身 来说,如果我们在WinXP中使用Automatic Updates自动更新,或在Internet上使用证书进行身份验证以及正确管理这些证书等,那么这个服务就不要关闭。其中这个功能最有用的是,当你安 装一个驱动程序时,以确定它是不是通过微软认证的。因为驱动程序在操作系统内可以获得很高的运行权限,含有恶意代码的驱动程序会让你玩完,因而开发驱动程 序的厂家一般都会去做微软认证,通过验证后,微软会在里面添加它的认证数据,再到你机器上安装时就可以通过CryptSvc检测升级。
11.DHCP Client
Dhcp(DHCP客户端服务)的进程名是 Svchost.exe,WinXP Home/Pro默认安装的启动类型为自动,依赖AFD Networking Support Environment、NetBIOS over TCP/IP以及TCP/IP Protocol Driver服务。简单的说DHCP过程就是由网络中一台主机(DHCP Server)将所有的网络参数自动分配给网络内的任何一台计算机,而DHCP Client就是网络中被分配网络参数的对象计算机了。如果能在网络中被自动分配IP地址等网络参数,那么这个DHCP Client服务就必不可少。对于家庭单机用户来说,只要是使用DSL/Cable上网、开启ICS和IPSEC服务的人都需要这个来指定静态IP,所以 通常这个服务是不关闭的,除非你的机器是完全的单机应用环境。
12.Distributed Link Tracking Client
TrkWks(分布式连结追踪客户端服务)的进程名是Svchost.exe,WinXP Home/Pro默认安装的启动类型为自动,依赖Remote Procedure Call服务。对于计算机有一定了解的人对于"分布式"这个词并不陌生,这里就不作解释。TrkWks服务简单说,就是将整个网络中分散于各台计算机上互 相有连接的NTFS文件看作一个整体,相当于一台机器上的文件系统,所以当系统内发生文件移动,就会记录这个信息。它是针对"域用户"的"NTFS文件" 的"分布式连接",这3个条件缺一个你就用不上它,对于不在局域网的单机用户来说,当然是禁用它。
13.Distributed Transaction coordinator
MSDTC(分布式交易协调器)的进程名是Msdtc.exe,WinXP Home/Pro默认安装的启动类型是手动,依赖Remote Procedure Call和Security Accounts Manager服务。MSDTC主要用来处理分布式交易,所谓分布式交易,就是跨越两个或多个数据库的单一SQL Server内部的交易。同一数据库内不同数据表间的交易,则不能称作分布式交易。显然对于需要同时处理多个数据库或文件系统的用户来说,这个服务意义重 大,但它也是通常意义上一般用户不会使用到的服务,通常来默认手动启动就好了,其实这个服务也容易受到远程拒绝服务攻击,禁用它也没有问题,而且更安全。
14.DNS Client
Dnscache(DNS客户端服务)的进程名是Svchost.exe,WinXP Home/Pro默认安装的启动类型为自动,依赖TCP/IP Protocol Driver服务。DNS(Domain Name System)也是常见的名词了,简单的解释就是当使用网页浏览器去上网时,会键入网站的网址,而这些网址名称在因特网上就是透过网域名称服务器(DNS 服务器)来完成名称转换为IP地址的解释。实际上一些网站并不是只有一台服务器在工作,而是有多台服务器在同时工作,也就是说同样一个网站名称地址可对应 不同的IP地址(在Win2000以前的操作系统可执行此查询)。但如果将操作系统换到Win2000或XP,同样的网站你又会发现总是查到同一个IP地 址。为什么会这样呢?这就是DNS Client服务的作用。
为了要达到用最快速、最有效率的方式,让客户端能够迅速找到网域的验证服务,在Win2000/XP系统中,加入了DNS快取(Cache)的功能,当第 一次在找到了目的主机的IP地址后,操作系统就会将所查询到的名称及IP地址记录在本机的DNS快取缓冲区中,下次客户端还需要再查询时,就不需要到 DNS服务器上查询,而直接使用本机DNS Cache中的数据即可,所以你查询的结果始终是同一IP地址。这个服务关闭与否影响并不大,在安全性上最多只是可以泄漏你的缓存内容,确定你曾经访问过 的网站。
15.Error Reporting Service
ERSvc(错误报告服务)的进程名是Svchost.exe,WinXP Home/Pro默认安装的启动类型为自动,依赖Remote Procedure Call服务。这个服务我们经常碰到,当使用程序出错时会跳出对话框,问你是否需要向微软发送报告,就是这个服务的功能。此服务完全可设置为手动或禁止。 如果你想对错误报告进行更详细的设置,可以右键单击"我的电脑"图标,选择"属性",在"高级选项卡"下点击"错误报告"按钮,在那里你可以决定是否发送 错误报告以及发送怎样的错误报告。而对于没有上网的用户就可直接禁用此服务了,上网用户如果担心报告会向微软透漏你的私人信息(当然微软保证不会发生这种 事情),也大可禁用它。
16.Event Log
Eventlog(系统日志纪录服务)的进程名是 Services.exe,WinXP Home/Pro默认安装的启动类型为自动,没有服务依存关系。Event Log服务负责记录来自系统和运行中程序的管理事件消息,为Windows和应用程序提供了一个标准而集中的方法来记录重要的软件和硬件事件。打开事件查 看器的方法是依次打开"开始→控制面板",然后选择打开"管理工具→事件查看器"。这个服务是基础服务,无法调整关闭。
17.Fast User Switching Compatibility
Fast User Switching Compatibility(多用户快速切换服务)的进程名是svchost.exe,WinXP Home/Pro默认安装的启动类型是手动,依赖Terminal Services服务。此服务是WinXP的新技术,即快速的多用户切换环境。解决了以前的多用户环境虽然安全但是切换用户环境需要重新启动,并丢失上一 用户工作环境的问题。使用很简单,只要进行"开始→注销→切换用户"操作即可方便地切换用户环境,是非常不错的多用户技术,如果用不着多用户环境就不用打 开它(加入域后默认不能进行快速切换,当然可禁用)。
18.FAX Service
FAX(传真服务)的进程名是 Fxssvc.exe,WinXP Home/Pro中默认是没有安装的,依赖Plug and Play、Print Spooler、Remote Procedure Call、Telephony服务。FAX服务在默认情况下是没有安装的,但如果你安装了它就可以进行"开始→所有程序→附件→通讯→传真"操作,使用 WinXP内置的传真服务来收发传真了,当然你要保证你的机器至少还保留了一只小猫。不需要的人就禁用吧。
19.Help and Support
Helpsvc (帮助服务)的进程名是Svchost.exe,WinXP Home/Pro中默认安装的启动类型为自动,依赖Remote Procedure Call服务。这个服务用于支持WinXP帮助和支持中心的功能,如果你刚开始使用WinXP,这个帮助中心能解决不少问题,如果你觉得不需要它了,那就 禁用吧。
20.Human Interface Device Access
HidServ(人性化接口装置服务)的进程名是 Svchost.exe,WinXP Home/Pro中默认安装的启动类型是禁用,依赖Remote Procedure Call服务。这个服务简单说就是支持那些所谓的带有多媒体功能智能键盘,比如音量调节。当然你有符合人体工程学标准的设备(主要指键盘和鼠标),那么这 个服务就设置为自动,否则这些设备的一些功能将不能正常使用。而如果你没有这类设备或者你的设备有自己的驱动,即可禁用此服务。
21.IMAPI CD-Burning COM Service
ImapiService(IMAPI CD刻录服务)的进程名是Imapi.exe,WinXP Home/Pro中默认安装的启动类型是手动,没有任何的服务依存关系。这个就是WinXP内置的CD刻录服务了,杂志2003年第12期对此有过较详细 的介绍。总的来说该服务的功能和性能十分有限,有刻录机的朋友还是安装成熟的第三方刻录软件,关闭这个服务吧。
22.Indexing Service
Cisvc (索引服务)的进程名是Cisvc.exe,WinXP Home/Pro中默认安装的启动类型是手动,依赖Remote Procedure Call服务。这个服务可为本地和远程计算机上的文件编制索引,也就是说像图书馆里为图书编制的查询索引一样,这样可加快寻找文件的速度。开启此项服务对 个人用户而言有一个很大的帮助,就是文件浏览速度(即双击某文件夹后的等待时间)会明显增加,因为系统已将目录结构读入了内存,需要时会直接调用。但此服 务启用后某此情况会导致系统极度繁忙,通过任务管理器,可看见Cidaemon.exe这个进程占用了大部分CPU资源。因此对待这个不成熟的服务请根据 自己机器的情况设为"自动"或"禁用"。
23.Internet Connection Firewall/Internet Connection Sharing
SharedAccess (Internet连接共享和防火墙服务)的进程名是Svchost.exe,WinXP Home/Pro中默认安装的启动类型分别是手动和自动,依赖Application Layer Gateway Service、Network Connections、Network Location Awareness、Remote Access Connection Manager服务。这个服务提供WinXP内置的Internet连接共享和防火墙功能。笔者比较喜欢这两个功能,性能都不错而且方便,具体关闭与否看 个人喜好,不用就可以关闭它。
24.IPSEC Services
PolicyAgent(IP安全策略服务)的进程名是 Lsass.exe,WinXP Home/Pro中默认安装的启动类型为自动,依赖IPSEC driver、Remote Procedure Call、TCP/IP Protocol Driver服务。IPSEC是一种用来保护内部网、专用网络以及外部网(Internet、Extranet)免遭攻击的重要防御方法,主要特征在于它 可对所有IP级的通信进行加密和认证,正是这一点才使IPSEC可以确保包括远程登录、客户/服务器、电子邮件、文件传输及Web访问在内的多种应用程序 的安全。由于企业及政府用户非常注重于部署安全的IP,所以这一服务显得很重要。同时也可以看到,对于绝大多数用户来说,这是个根本就不用关心的东西。所 以禁用它吧。
25.Logical Disk Manager
Dmserver(逻辑磁盘管理员服务)的进程名是Svchost.exe,WinXP Home/Pro中默认安装的启动类型分别是手动和自动,依赖Plug and Play、Remote Procedure Call服务。Dmserver用来动态管理磁盘,如显示磁盘可用空间和使用Microsoft Management Console(MMC)主控台中的磁盘管理功能。这个服务对于经常使用移动硬盘、U盘等外设的朋友来说必不可少,没有的话可选择禁用它。
26.Logical Disk Manager Administrative Service
Dmadmin(逻辑磁盘管理系统管理服务)的进程名是Svchost.exe,WinXP Home/Pro中默认安装的启动类型分别是手动和自动,依赖Logical Disk Manager、Plug and Play、Remote Procedure Call服务。Dmadmin主要用来配置硬盘信息,平时基本上没用。打开"计算机管理"(Microsoft Management Console,简称MMC)时,你可以看到"磁盘管理",这时就会用上它,可设为手动。
27.Messenger
Messenger (信使服务)的进程名是Services.exe,WinXP Home/Pro中默认安装的启动类型为自动,依赖NetBIOS Interface、Plug and Play、Remote Procedure Call、Workstation服务。Messenger这个服务上过网的人都应该比较熟悉,本来Microsoft开发"信使服务"是为了方便同一域 中的管理员进行信息交流,后来有些人开发了突破域限制的信使发送工具,于是大家挂在网上时,计算机上经常会弹出一个名为"信使服务"的对话框,这些不请自 到的"信使"基本上是一些垃圾信使信息,有无聊的广告,有非法的信息等。通常这些信息是用一些名为"凶宝宝信使"、"妖刺"的软件发布的,但实际上如果是 在同一域中,只需要用NET SEND命令就可以轻易发送消息了。突然出现的"信使服务"不仅会干扰工作,影响心情,而且还容易遭到"社会工程"攻击,所以禁用它吧。
28.MS Software Shadow Copy Provider
SwPrv(管理磁盘区卷影复制服务)的进程名是dllhost.exe,WinXP Home/Pro中默认安装的启动类型是手动,依赖Remote Procedure Call服务。这个服务是为WinXP中的MS Backup备份程序提供支持,奇怪的是即使关掉它我的备份工作也可以顺利完成,用不着的话就禁用它吧。
29.Net Logon
Netlogon(网域登录服务)的进程名是lsass.exe,WinXP Home/Pro中默认安装的启动类型分别是手动和自动,依赖Workstation服务。这个服务是用来做网域审查的。当你的计算机处在一个域网内时, 如果要使用网内的域服务器登录到域网时,就要通过它来登录了。一般用户用不着,禁用即可。
30.NetMeeting Remote Desktop Sharing
Mnmsrvc (NetMeeting远程桌面共享服务)的进程名是Mnmsrvc.exe,WinXP Home/Pro中默认安装的启动类型是手动,依赖Remote Procedure Call服务。使用NetMeeting可透过公司内部网络,让使用者将计算机的控制权分享给局域网上或因特网上的其他使用者,很多人都因为安全问题关掉 它,而且它很占网络资源。但如果你想和别人做些非文字的交流,还是比较好玩的。注意关掉它后,远程桌面共享功能将无法使用。
31.Network Connections
Netman(网络连接服务)的进程名是svchost.exe,WinXP Home/PRO默认安装的启动类型是手动,依赖于Remote Procedure Call服务。Netman也是非常重要的基础服务,它管理着"网络和拨号连接"文件夹中的所有对象,任何有关于网络上(局域网、Internet)的连 接都需要这个服务。如果被禁用,在"网络和拨号连接"文件夹中将什么都看不到,更不用说新建连接和拨号上网了。因此除非你的机器是绝对的单机环境,才可将 其关闭。
32.Network DDE
NetDDE(网络动态数据交换服务)的进程名是netdde.exe,WinXP Home/PRO默认安装的启动类型是手动,依赖于Network DDE DSDM服务。NetDDE(Network Dynamic Data Exchange)是微软早期设计的一种方法,可让应用程序在不同PC上的Windows之间交换动态数据,现在已经很少使用。实际上在WinXP中,真 正使用它的只有ClipBook服务,回顾上一期中提到的3人共同开发文档,通过ClipBook来交换动态数据的例子就可以很好理解这个服务的作用了。 数据共享服务通常是经过可信赖的沟通渠道,负责管理这项服务的是网络DDE代理(Network DDE Agent),实际上网络DDE代理会使机器非常容易遭受攻击而失去本机的管理员控制权。因此如果无需ClipBook共享这个特殊服务,不妨禁用。
33.Network DDE DSDM
NetDDE dsdm(网络动态数据交换网络共享服务)的进程名是netdde.exe,WinXP Home/PRO默认安装的启动类型是手动,它不依赖于其他服务。如果此服务终止,Network DDE服务将不可用,实际上如果不用Network DDE,那么Network DDE DSDM也禁用好了。
34.Network Location Awareness
NLA (网络位置识别服务)的进程名是svchost.exe,WinXP Home/PRO默认安装的启动类型是手动,依赖于AFD网络支持环境和TCP/IP Protocol Driver服务,而ICF/ICS服务依赖于它。NLA可以探测网络系统的相关信息,当这些信息发生变化时通知相关的应用程序。基本上,这个服务主要针 对的对象是笔记本电脑。因为在实际工作和生活中,人们的笔记本电脑常常在超过一个以上的网络环境中应用。经常可能遇到在一个网络中需要使用动态IP地址, 而在另一网络中需要使用静态IP地址的问题。比如说你在办公室里使用的是动态IP,而在家里却使用静态IP来连接宽带,那么NLA就可让你在家里及单位网 络(有线)之间切换时自动辨认出不同网络环境,从而自动选择合适的配置而无需重新调整网络参数。对于经常移动办公的人,这确实是个不错的功能。
35.NT LM Security Support Provider
NtLmSsp (NT LM安全性支持提供者服务)的进程名是lsass.exe,WinXP Home/PRO默认安装的启动类型是手动,它不依赖于其他服务。NT LM的意思即NT LanManger,是NT下提供的认证方法之一,使用了64位的加密手段。NtLmSsp这个服务主要针对RPC(远程过程调用),通常RPC可以选择 基于两种通信方式,一种是传输协议,比如TCP/IP、UDP、IPX等,另一种为命名管道(Pipeline)。通常情况下Windows默认选择都是 传输协议,而由于RPC是采用非加密传输的,通信数据安全无法得到保证,而NtLmSsp就可向这一类RPC提供安全服务。WinXP中已知的这类RPC 应用就是Telnet服务(Telnet也依赖于NtLmSsp),因此无需Telnet服务的单机用户可将NtLmSsp其关闭。
36.Performance Logs and Alerts
SysmonLog (效能记录日志及警示服务)的进程名是smlogsvc.exe,WinXP Home/PRO默认安装的启动类型是手动,它没有任何服务依存关系。如果打开控制面板的管理工具,可以看到有"性能"这个工具,它较详细地反映了系统的 性能,但配置起来相当复杂,不好上手,而且大多数人也会认为这个性能工具没什么意义。
SysmonLog就是为它提供日志记录的服务。如果 你对自己机器的工作状态比较在意,这绝对是一个值得研究的工具,因为它可以严格监视硬盘、内存、CPU甚至于软件在系统中的运行,并通过记录下的日志数据 分析机器软硬件资源的具体情况。更有用的是,如果你比较了解计数器这个参数的设置,就可为各部分资源设置合适的计数器值,一旦服务监视到资源的性能值超过 或是低于此值,就会通过Messenger服务发出警告,如此很容易就能觉察到机器的某部分资源不足(如若升级电脑就可先从这里考虑)或发生了故障等。当 然,并不关心自己机器具体工作的用户也可将其关闭。
37.Plug and Play
PlugPlay(即插即用服务)的进程名是services.exe,WinXP Home/PRO默认安装的启动类型是自动,它不依赖于任何服务。这个服务想必大家相当熟悉,从Win98开始这个技术就始终是微软操作系统的核心部分。 即插即用是Intel开发的一组规范,它赋予了计算机自动检测和配置设备并安装相应驱动程序的能力,当有设备被更改时能自动通知当前设备的状况并使用该设 备变更后的程序。PlugPlay是WinXP的几个基础服务之一,在服务管理工具中无法调整它,而且如果本服务一旦失败就只有重新启动机器了。
38.Portable Media Serial Number Service
WmdmPmSp(便携的媒体序号服务)的进程名是svchost.exe,WinXP Home/PRO默认安装的启动类型是自动,它没有任何服务依存关系。这个服务其实非常简单,它是微软用来防盗版的工具之一,但目前基本上只是针对音乐。 微软用它获得你系统中媒体播放器的序列号,做什么用呢?其实它是在试图控制你将盗版的音乐文件拷贝到类似MP3、MD等便携播放器上。尽管微软声称关掉这 个服务会影响将正版音乐下载到便携播放器,但笔者还是关掉这个服务,一是影响并不大,至少手上的正版CD拷贝到MP3是没有问题的,二是微软也刺探得太多 了吧,我们用什么还都得报告它?
39.Print Spooler
Spooler(打印后台处理服务)的进程名是 spoolsv.exe,WinXP Home/PRO默认安装的启动类型是自动,依赖于Remote Procedure Call。Spooler是为了提高文件打印效率,将多个请求打印的文档统一进行保存和管理,先将要打印的文件拷贝到内存,待打印机空闲后,再将数据送往 打印机处理。这样处理速度更快些。建议将其设置为手动,有打印任务时再打开。如果没有打印机自然是禁用了。
40.Protected Storage
ProtectedStorage (受保护存放区服务)的进程名是lsass.exe,WinXP Home/PRO默认安装的启动类型是自动,依赖于Remote Procedure Call。这一服务提供对敏感性数据保护的功能,比如密码、证书等,但通常它只针对Windows自身的敏感数据进行保护,可用来储存你计算机上的密码。 通常上网的用户都比较喜欢开这个服务,毕竟像自动填表这些功能给人带来不少方便。但如果你的电脑是多用户环境,或是使用笔记本电脑,经常移动办公,那么这 个服务就要谨慎使用了。有不少密码破解软件就是针对这个ProtectedStorage的,比较有名的有Protected Storage PassView,用它可以轻易得到被储存在ProtectedStorage中你曾经上过的论坛的帐号密码、拨号密码等。因此,对于这个服务要视使用环 境而定,在不安全的环境下还是关闭较好。
41.QoS RSVP
RSVP(QoS 许可控制服务)的进程名是rsvp.exe,WinXP Home/PRO默认安装的启动类型是手动,依赖于AFD Networking Support Environment、Remote Procedure Call、TCP/IP Protocol Driver服务。这就是微软那个饱受争议的占用了20%网络带宽的服务了。对大多数朋友来说,关掉它是简单正确的选择。但是要理解这个服务究竟是干什么 的就不这么简单了。QoS这个词的意思是服务质量(Quality of Service),而RSVP这个词的意思是资源预留协议(ReSerVation Protocol)。
随着IP技术和网络的发展,世界 各国的运营商基于IP网络已开发出多种多样的新业务。由于目前基于存储转发机制的Internet(IPv4标准)只为用户提供了"尽力而为(best- effort)"的服务,不能保证数据包传输的实时性、完整性以及到达的顺序性,更无法保障实时多媒体业务服务质量(QoS),所以主要应用在文件传送和 电子邮件服务。而随着Internet的飞速发展,人们对于在Internet上传输多媒体信息的需求越来越大,这就要求网络应能根据用户的要求分配和调 度资源,传统的"尽力而为"转发机制已不能满足用户的要求。为解决这一问题,美国于1996年底开始了以提高网络服务质量研究为核心的InternetⅡ 以及NGI(下一代Internet)等研究项目。相关的权威组织IETF(Internet Engineering Task Force)也成立了专门的工作小组来研究多媒体服务质量的定义和相关标准。IETF在IP网络的QoS方面提出了多种服务模型和机制,其中的综合业务模 型(Int-Serv)引入了一个重要的网络控制协议RSVP(资源预留协议),这一模型的思想是"为了给特定的客户包流提供特殊的QoS,要求路由器必 须能够预留资源。反过来要求路由器中有特定流的状态信息"。所以可以看出,这一模型能提供绝对有保证的QoS,是以预留下的资源作为代价的,对资源的要求 实际上是更高的。因此,对于WinXP中的QoS RSVP服务保留了20%的网络带宽也就不足为奇了,由于对于个人应用几乎毫无意义,禁用它是不二选择。
42.Remote Access Auto Connection Manager
RasAuto (远程访问自动联机管理员服务)的进程名是svchost.exe,WinXP Home/PRO默认安装的启动类型是手动,依赖于Remote Access Connection Manager、Telephony服务。RasAuto主要针对宽带使用,当有网络连接请求时它会自动打开网络连接,我们在使用WinXP时会经常弹出 一个自动拨号窗口,就是它在工作。如果你的机器提供网络共享服务就开着它,避免网络断线后手动连接,否则可将其关闭。
43.Remote Access Connection Manager
RasMan(远程访问联机管理员服务)的进程名是svchost.exe,WinXP Home/PRO默认安装的启动类型是手动,依赖于Telephony服务,其简单描述是"创建网络连接",这个解释简单明了,所以根据自己系统的情况来使用这个服务即可。
44.Remote Desktop Help Session Manager
RDSessMgr (远程桌面协助服务)的进程名是sessmgr.exe,WinXP Home/PRO默认安装的启动类型是手动,依赖于Remote Procedure Call服务。这是与NetMeeting Remote Desktop Sharing很类似的一个服务。鼠标点击"开始→所有程序→附件→通讯→远程桌面连接"可开远程桌面功能,而RDSessMgr就是为它提供支持。微软 的原意是通过它做远程帮助,其代价是牺牲安全与4MB内存的占用,不需要时一定得关闭。
45.Remote Procedure Call
RpcSs (远程过程调用服务)的进程名是svchost.exe,WinXP Home/PRO默认安装的启动类型是自动。太多服务依赖于这一服务了,最近"冲击波"横行,恐怕大家都对RPC有此印象了吧,它原名远程进程调用,是早 期IBM、SUN等公司定义的功能级通信协议,随后被微软采纳,但作了改动,称之为MRPC。总的来说RPC是一种消息传递功能,上一期说过 Windows系统是个典型的消息(事件)处理型系统,所以RPC对于系统的重要性不言而喻。由于Windows内部结构已相当复杂了,很难搞清楚哪些模 块在用RPC哪些不用,事实上你只要关掉它,系统就可能崩溃。所以这个服务也是不可禁用的。
46.Remote Procedure Call(RPC)Locator
RpcLocator (远程过程调用定位服务)的进程名是locator.exe,WinXP Home/PRO默认安装的启动类型是手动,依赖于Workstation服务。这一服务和上面的RPC服务并无太多关系,是用来给RPC的命名服务的。 其用途简单解释就是,通过它对RPC的命名管理,调用者才能找到被调用者的位置。但由于微软系统注册表的存在,使得这些命名服务在本机上的调用上毫无意 义。因此对于一般用户完全可以关闭。
47.Remote Registry
RemoteRegistry(远程注册表服务)的进 程名是svchost.exe,在WinXP Home下不可用,在WinXP PRO下默认安装的启动类型是自动,依赖于Remote Procedure Call服务。此服务是向其他连机的计算机开放你的注册表,微软总是让这种明显是安全隐患的服务自动启动实在让人费解。不过如果你有这种特殊需求的话可以 尝试一下。打开注册表编辑器Regedit,在文件菜单栏里找到"连接网络注册表"这一项,可让你打开甚至编辑其他机器上的注册表。当然那些机器上的 RemoteRegistry也必须是打开的,而且对你计算机的一些相应权限同样必须开放。
48.Removable Storage
NtmsSvc (卸除式存放装置服务)的进程名是svchost.exe,在WinXP Home/PRO下默认安装的启动类型是手动,依赖于Remote Procedure Call服务。此服务的名称太容易让人误解,实际上它只是对特殊可移动存储器的管理,比如ZIP软驱和磁带驱动器,不要担心你的CD和DVD等设备。从事 图像设计的用户经常会用ZIP同苹果机交换文件,一般人恐怕很少使用这些特殊设备,因此可将其关闭。
49.Routing and Remote Access
RemoteAccess (路由和远程访问服务)的进程名是svchost.exe,在WinXP Home/PRO下默认安装的启动类型分别为禁用和手动,依赖于NetBIOSGroup、Remote Procedure Call服务。Routing and Remote Access为软路由,即在一台连接多个网络的计算机上通过运行路由软件,以实现网络间路由的一种方法,相对于硬件路由来说很是方便经济。WinXP也把 这个功能集成到系统里来了,不过可能比较少人知道是在哪里配置路由,主要原因就是这个服务默认为关闭。首先启动此服务,网络连接文件夹里会多出一个"传入 的连接",值得注意的是,在VPN连接(传入的连接)的属性"Internet协议(TCP/IP)"里一般要指定TCP/IP地址(一般来说都必须是合 法地址)才行。感兴趣的朋友可以自己继续研究,而大多数不需要的朋友直接禁用它吧。
50.Secondary Logon
Seclogon (二次登录服务)的进程名是svchost.exe,在WinXP Home/PRO下默认安装的启动类型是自动,没有任何服务依存关系。这个服务对应于用户临时权限分配功能,在多用户使用的计算机上,某些用户因为是非管 理员权限,导致某些程序无法执行。为了让没有管理员权限的已经登录用户可以使用这些程序,WinXP设计了这个功能来分配临时的管理员权限。打开这个服务 后,右键点击鼠标选择"运行方式"将会出现对话框,让你选择执行这个程序的用户身份。对多用户环境下的管理员,这确实是方便的功能,不过依然是以安全作为 代价的,对单人环境的笔记本电脑用户来说尤其无用而且危险!所以要谨慎使用。
51.Security Accounts Manager
SamSs(安全账户管理 服务)的进程名是lsass.exe,在WinXP Home/PRO下默认安装的启动类型是自动,依赖于Remote Procedure Call服务。熟悉WinXP启动过程的用户都知道SAM文件的重要性,SamSs是负责SAM数据库的控制和维护的服务。SAM数据库位于注册表 "HKLM\SAM\SAM"下,可使用Regedit32.exe打开注册表编辑器,并设置适当权限查看SAM中的内容。SAM数据库保存在磁盘上的" 系统盘\windows\system32\config"目录下的sam文件中,在这个目录下还包括一个security文件,是安全数据库的内容,两 者有不少关系。SAM数据库中包含了系统中所有组、账户的信息。而WinXP启动时就需要在SAM文件中读取诸如用户名、用户全名(full name)、所属组、描述、密码、注释、是否可以更改密码、密码设置时间等信息。这也是系统中不可关闭的几个基础服务之一,如果服务启动失败,系统就只有 重启了。
52.Server
Lanmanserver(服务器服务)的进程名是svchost.exe,在WinXP Home/PRO下默认安装的启动类型是自动。Server服务对应的是网络上的文件/打印机器共享,以及网络的路径映射共享功能。没有这些方面的需要你就可以关闭它。
53.Shell Hardware Detection
ShellHWDetection (外壳硬件探测服务)的进程名是svchost.exe,在WinXP Home/PRO下默认安装的启动类型是自动,依赖于Remote Procedure Call服务。对这个服务微软是语焉不详,也没有给出详细的硬件描述或列表,不过根据网络上不少人的测试,这个服务主要还是和具有自动运行(播放)功能的 硬件有关系,例如数字相机、CD-ROM等。通过这个服务,当这些硬件接上系统或放入相应媒介时,WinXP能自动探测到并做出对应动作。对于外设越来越 多的现在,没有把握还是不要轻易关闭它。
54.Smart Card
SCardSvr(智能卡服务)的进程名是 SCardSvr.exe,在WinXP Home/PRO下默认安装的启动类型是手动,依赖于Plug and Play服务。Smart Card(智能卡)其外型和一般信用卡大小一样,但多了一块指甲大小的IC芯片后,使原本普通的一张卡片变成拥有资料控管与逻辑运算的能力。智能卡包括金 融卡、GSM卡等,与我们一般常用的电话IC卡相比,内部的IC线路设计不同。由于卡内本身即已包含了CPU功能、ROM、EEPROM、RAM等元件, 智能卡就像一台可随身携带的超微型电脑,可用来储存及处理重要资料。在安全性方面,智能卡具有自我毁灭系统,想窃取卡上的资料非常困难。如果你拥有智能卡 及相关的读卡设备就开启这个服务,否则就禁用吧。
55.Smart Card Helper
SCardDrv(智能卡协助服务)的进程名是SCardSvr.exe,在WinXP Home/PRO下默认安装的启动类型是手动,它没有任何服务依存关系。只要没有相关的设备就禁用好了。
56.SSDP Discovery Service
SSDPSRV(简易服务发现协议之发现服务)的进程名是svchost.exe,在WinXP Home/PRO下默认安装的启动类型是手动。SSDPSRV主要用于局域网上UPnP(Universal Plug and Play,统一即插即用)设备的搜索。UPnP并不同于我们平常熟悉的PnP,UPnP技术PnP对进行了扩展,简化了家庭或企业中智能设备的联网过程。 UPnP规范基于TCP/IP协议和针对设备彼此间通信而制订的其他Internet协议,这就是它之所以被称作"通用"的原因所在-——UPnP技术不 依赖于特定的设备驱动程序,而是使用标准协议。与即插即用相比,这种技术的意义在于,能够轻易地使家庭等非专业用户享受到智能化技术带来的更舒适完美的生 活,例如,正是UPnP才使得能在网上冲浪的电冰箱成为可能。UPnP是个较新的协议,也不是非常成熟,对应设备在市场上非常罕见,市场上流行的 Linksys BEFSR41W无线路由器是这方面的例子。对于大多数现在还无缘使用此类设备的朋友,关闭这个服务吧。
57.System Event Notification
SENS(系统事件通知服务)的进程名是svchost.exe,在WinXP Home/PRO下默认安装的启动类型是自动,依赖于COM+ Event System服务。它的简单描述是"跟踪系统事件,如登录Windows、网络以及电源事件等。将这些事件通知给COM+事件系统‘订阅者 (subscriber)’"。这已将服务的内容解释得很清楚了。尽管有人认为这个服务无关紧要,事实上系统是否需要它取决于你在系统里安装了些什么,而 许多应用程序的运行是要通过SENS来实现的,所以建议还是让它自动打开为好。
58.System Restore Service
Srservice (系统还原服务)的进程名是svchost.exe,在WinXP Home/PRO下默认安装的启动类型是自动,依赖于Remote Procedure Call服务。这是大家都非常熟悉的系统还原功能了,如果不使用的话,先在"我的电脑"属性中的系统还原选项卡关闭,然后在这里将服务禁用即可。
59.Task Scheduler
Schedule (计划任务服务)的进程名是svchost.exe,在WinXP Home/PRO下默认安装的启动类型是自动,依赖于Remote Procedure Call服务。此服务支持WinXP的计划任务,它能使程序在预定的时间自动运行,如定期进行磁盘碎片整理、病毒扫描、更新等,可根据自己的需要选择是否 开启。
60.TCP/IP NetBIOS Helper
LmHosts(TCP/IP NetBIOS 助手服务)的进程名是svchost.exe,在WinXP Home/PRO下默认安装的启动类型是自动,依赖于AFD网络支持环境、NetBios Over TCP/IP服务。该服务能在TCP/IP上提供NetBIOS支持。大家应该对TCP/IP比较熟悉了,相对来说NetBIOS网络协议对读者来说可能 比较陌生,它是由IBM开发的一个很古老的协议,当年在局域网上占据主导。由于NetBIOS不具备路由功能,也就是说它的数据包无法跨网段传输,因此在 广域网、城域网大行其道的今天,它只能退居配角。其实在Win95/98的网络协议中仍然保留着NetBIOS,不过它已经改名叫NetBEUI (NetBIOS扩展用户接口),是NetBIOS的Microsoft改进版。由于NetBIOS是完全基于局域网的,因此作为访问Internet资 源的一般用户可以禁用它,除非你的系统处在小局域网中,而且使用的也正是NetBIOS协议。
61.Telephony
TapiSrv(电话服务)的进程名是 svchost.exe,在WinXP Home/PRO下默认安装的启动类型是手动,依赖于Plug and Play、Remote Procedure Call服务。简单地说这个服务能为计算机提供电话拨号的能力。如果你使用了任何形式的拨号,不管是用拨号调制解调器还是DSL/Cable连接到 Internet,还是通过电话线连接其他计算机,或是拨打电脑IP电话、发传真等,你就有必要保留这个服务,反之就可关掉它。
62.Telnet
TapiSrv(远程登录服务)的进程名是tlntsvr.exe,在WinXP Home下不可用,在WinXP PRO下默认安装的启动类型是手动,依赖于NT LM Security Support Provider、Remote Procedure Call、TCP/IP Protocol Driver服务。这是一个容易遭到误会的服务名称,一般人会误以为这是以前DOS下那个Telnet,关了之后就无法使用BBS。其实它与BBS无关, 完全是微软自己的Telnet系统,尽管两者的原理相差不大,即让用户以模拟终端的方式,登录到Internet的某台主机上,一旦连接成功,这些个人计 算机就好像是远程计算机的一个终端,可以像使用自己的计算机一样输入命令,运行远程计算机中的程序。基于安全性理由,如果没有特别需求,这个服务一定要关 掉禁用。
63.Terminal Services
TermService(终端机服务)的进程名是svchost.exe,在 WinXP Home/PRO下默认安装的启动类型是手动,依赖于Remote Procedure Call服务。它的简单描述是"允许多位用户连接并控制一台机器,并且在远程计算机上显示桌面和应用程序。这是远程桌面(包括管理员的远程桌面)、快速用 户转换、远程协助和终端服务器的基础结构"。这段描述已将该服务的用途解释得很清楚了,需要强调的是,这些方便都是以安全为代价的,如果平时不用就一定要 关掉。
64.Themes
Themes(主题服务)的进程名是svchost.exe,在WinXP Home/PRO下默认安装的启动类型是自动,没有服务依存关系。很多人都喜欢使用XP的布景主题,不过如果用户没有使用就关闭好了。
65.Uninterruptible Power Supply
UPS (UPS电源管理服务)的进程名是UPS.exe,在WinXP Home/PRO下默认安装的启动类型是手动,没有服务依存关系。它的简单描述是"管理连接到计算机的不间断电源(UPS)",同样很好理解,UPS(不 间断电源供应)一般用户极少用到,除非你的电源供应器具备此功能,不然可关闭。
66.Universal Plug and Play Device Host
UPNPhost (统一即插即用驱动主机服务)的进程名是svchost.exe,在WinXP Home/PRO下默认安装的启动类型是手动,依赖于SSDP Discovery Service服务。它同SSDP Discovery Service是继承关系,后者搜索发现UPnP设备,而UPNPhost为UPnP设备提供驱动支持。当然通常情况下关闭即可。
67.Upload Manager
Uploadmgr (上传管理服务)的进程名是svchost.exe,在WinXP Home/PRO下默认安装的启动类型是自动,依赖于Remote Procedure Call服务。这个服务的具体效果不明,关闭它后实际使用中的网络上传下载并没有受到什么影响,也许它跟微软的服务器和相关服务有关?请根据需要关闭。
68.Volume Shadow Copy
VSS(上传管理服务)的进程名是vssvc.exe,在WinXP Home/PRO下默认安装的启动类型是手动,依赖于Remote Procedure Call服务。它的简单描述是"管理并执行用于备份和其他目的的卷影复制",依然是和WinXP备份有关的服务,它默认就是关闭的,也并没有在笔者的机器 上对备份造成影响,其具体应用依是未解之谜。
69.WebClient
WebClient(Web客户端服务)的进程名是 svchost.exe,在WinXP Home/PRO下默认安装的启动类型是自动,依赖于WebDav Client Redirector系统组件。使用WebDav可将档案或数据夹上传到某个Web服务,这个服务对于未来.NET意义更大。基于安全性的理由,现在你可 以尝试关闭它。
70.Windows Audio
AudioSrv(Windows音频服务)的进程名是 svchost.exe,在WinXP Home/PRO下默认安装的启动类型是自动,依赖于Plug and Play、Remote Procedure Call服务。理解这个服务再简单不过了,如果你的机器没有声卡可以关闭它
71.Windows Image Acquisition(WIA)
Stisvc (Windows影像取得服务)的进程名是svchost.exe,在WinXP Home/PRO下默认安装的启动类型是手动,依赖于Remote Procedure Call服务。该服务为控制面板中的"扫描仪和照相机"功能提供支持。通过这个功能,用户在安装好设备驱动后无需要再安装相关管理软件,就能轻易操作扫描 仪和数码相机来获得图像。不需要的用户可关闭它。
72.Windows Installer
MSIServer(Windows 安装服务)的进程名是msiexec\.exe,在WinXP Home/PRO下默认安装的启动类型是手动,依赖于Remote Procedure Call服务。这一服务同Application Management服务基本是一样的。从微软的解释看,Windows Installer服务应该是.MSI文件的最直接执行者。同样让人奇怪的是,这个服务默认就是关闭的,可.MSI文件的安装、修复或删除却很正常,和备 份工具一样,究竟这个服务在系统中扮演什么角色,如何工作,只有微软的工程师才知道了。
73.Windows Time
W32Time(Windows时间服务)的进程名是svchost.exe,在WinXP Home/PRO下默认安装的启动类型是自动,它没有服务依存关系。这一服务对应WinXP的Internet对时服务,如不需要关闭即可。
74.Windows Management Instrumentation(WMI)
Winmgmt (Windows管理规范服务)的进程名是svchost.exe,在WinXP Home/PRO下默认安装的启动类型是自动,依赖于Event Log、Remote Procedure Call服务。WMI是Windows中的基础管理结构,它通过一组常用接口来控制和监视系统(如对系统属性的查看与更改、设置用户权限等)。WMI为访 问大量的Windows管理数据提供了一个统一的机制。WMI通过脚本、C++程序接口、.NET类(系统管理)和命令行工具(WMIC)提供了对信息的 访问。WMI的功能还包括事件、远程、查询、查看、计划和实施用户扩展及更多内容。总而言之,虽然在服务管理工具中可以关闭,但最好别动它,否则会出现许 多莫名的问题。
75.Windows Management Instrumentation Driver Extensions
Wmi (Windows管理规范驱动延伸服务)的进程名是svchost.exe,在WinXP Home下不可用,在WinXP PRO下默认安装的启动类型是手动,没有服务依存关系。微软的白皮书介绍,该服务是作为WMI服务在驱动程序方面的一个延伸,简单说主要就是为让系统方便 地获知计算机中OEMs(original equipment manufacturers)以及IHVs(independent hardware vendors)等与硬件厂商相关的硬件信息。不过让人奇怪的是,为什么它在WinXP Home下不可用呢?
76.Wireless Zero Configuration
WZCSVC (无线配置服务)的进程名是svchost.exe,在WinXP Home/PRO下默认安装的启动类型是自动,依赖于NDIS Usermode I/O Protocol组件、Remote Procedure Call服务。它的简单描述是"为您的802.11适配器提供自动配置"。802.11是大家都比较熟悉的无线局域网协议标准了,其已经在市场上占据了优 势。当然,802.11协议、蓝牙标准和HomeRF工业标准是无线局域网所有标准中最主要的竞争对手,它们也各有优劣。然而802.11b无线局域网技 术已经在美国得到了广泛的应用,所以微软的WinXP内置服务支持也就不足为奇了。如果你没有使用无线网络适配卡装置,那么可以关闭服务。
77.WMI Performance Adapter
WmiApSrv (WMI性能适配器服务)的进程名是wmiapsrv.exe,在WinXP Home/PRO下默认安装的启动类型是手动,依赖于Remote Procedure Call服务。此服务提供了从WMI HiPerf 提供者获得的性能库信息,需要以手动方式进行配置,并不会在缺省状态下实现运行。该服务太过专业,无法解释得浅显,对于普通的使用者最好保持其默认状态。
78.Workstation
Lanmanworkstation(工作站服务)的进程名是svchost.exe,在WinXP Home/PRO下默认安装的启动类型是自动,它不依赖于其他服务,但有不少服务都依赖它。该服务同样为基础服务,请保持其默认状态不要关闭.
posted @
2006-05-21 03:01 Jerry Cat 阅读(1033) |
评论 (1) |
编辑 收藏
Windows凭据管理
原文:http://www.cppblog.com/Squirrel/archive/2006/05/20/7445.html
题目中的Windows凭据(Credential)其实就是指用户帐户和口令。最近项目中存在一台Windows(PC)机去管理服务器(Server),这之中就设计到服务器管理员权限的问题。需要用户对Windows上存储的用户名和密码进行管理。
在Windows XP和Server 2003 中都已存在了“存储的用户名和密码”。在XP中,通过控制面板中的用户帐户-〉选择用户-〉管理我的网络密码。而在Server 2003中,则在控制面板下直接有“存储的用户名和密码”项。
我们调用一些API,如WTSOpenServer,QueryServiceStatus,NetUserEnum等等涉及到RPC的,只要当前用户存储有目标远程机的权限合适的凭据,则这些API就不会因产生ERROR_ACCESS_DENIED而执行失败。因为我还不Windows的底层是如何进行控制的,比如,是否调用了SSPI,所以,执行这些API时,我只能向用户要管理员口令。但又不可能每次都让用户去输入一遍用户名和密码,那么,也就需要保存密码。
既然保存了密码,就必须考虑删除密码,那么密码管理的问题也就来了。说到密码管理,我在前些年看电视的时候,看到介绍一个叫什么“网络螃蟹”的网站,他就是专门提供个人密码管理的,当时我就想,有人会去把自己的密码交给别人打理吗?这好像不大可能。后来也就没听到什么网络螃蟹横行的消息。
现在我的项目中,如果用户有了一台机器(PC)的密码,那么,他就有了N台服务器的管理员权限。这当然是不被允许的了。怎么办?
找了一些API,是Authentication Functions系列的。于是,下面一个小实验代码就是想来枚举用户凭据的。#include <windows.h>
#include <WinCred.h>
int main(){
DWORD dwCount = 0;
PCREDENTIAL * pCredArray = NULL ;
if( CredEnumerate( NULL, 0, &dwCount, &pCredArray ) ){
for( DWORD dwIndex = 0; dwIndex < dwCount; dwIndex++){
PCREDENTIAL pCredential = pCredArray[dwIndex];
cout << "*********************************\r\n";
cout<< "Flags: " << pCredential->Flags << "\n"
<< "Type: " << pCredential->Type << "\n"
<< "Name: " << pCredential->TargetName << "\n"
<< "Persist: "<< pCredential->Persist << "\n"
<< "User: " << pCredential->UserName << "\n";
cout << "Data: \r\n";
char szHexBuffer[256] = "";
char szAsciiBuffer[256] = "";
char szHex[16];
char szAscii[2];
DWORD dwByte;
for (dwByte = 0; dwByte < pCredential->CredentialBlobSize; dwByte++)
{
BYTE byte1 = pCredential->CredentialBlob[dwByte];
sprintf(szHex, "%2.2X ", byte1);
szAscii[1] = '\0';
if (byte1 >= 32 && byte1 < 128)
szAscii[0] = (UCHAR)byte1;
else
szAscii[0] = ' ';
strcat(szHexBuffer, szHex);
strcat(szAsciiBuffer, szAscii);
if (dwByte == pCredential->CredentialBlobSize - 1
|| dwByte % 16 == 15)
{
printf("%-50s %s\r\n", szHexBuffer, szAsciiBuffer);
szHexBuffer[0] = '\0';
szAsciiBuffer[0] = '\0';
}
}
cout << "*********************************\r\n";
}
CredFree( pCredArray );
}
//system( "rundll32 keymgr.dll,KRShowKeyMgr");
return 0;
} 好像凭据数据还没能打出来。
后来,本着“编程的最高境界就是不编程”的精神,我想,如果直接把Windows的那个“存储的用户名和密码”对话框调出来用用不也可以吗。用ProcessExplorer,找到一个叫keymgr.dll的东西,嗯,估计对话框就在里面。
在“运行”中输入“control keymgr.dll”或“rundll32 keymgr.dll,KRShowKeyMgr”,对话框就出来了。
又省事了!
posted @
2006-05-21 02:43 Jerry Cat 阅读(738) |
评论 (0) |
编辑 收藏
/********************************************\
| 欢迎转载, 但请保留作者姓名和原文链接, 祝您进步并共勉! |
\********************************************/
[译著]在模板方法中的一些"反常"用法
作者: Jerry Cat
时间: 2006/05/19
链接:
http://www.cppblog.com/jerysun0818/archive/2006/05/19/7393.html
-------------------------------------
I. Virtually Yours -- Template Method模式
我在研究Wendy写的一个类。那是她为这个项目写的一个抽象基类,而我的工作就是从中派生出一个具象类(concrete class)。这个类的public部分是这样的:
class Mountie {
public:
void read( std::istream & );
void write( std::ostream & ) const;
virtual ~Mountie();
很正常,virtual destructor表明这个类打算被继承。那么再看看其protected部分:
protected:
virtual void do_read( std::istream & );
virtual void do_write( std::ostream & ) const;
也不过就是一会儿的功夫,我识破了Wendy的把戏:她在使用template method模式。public成员函数read和write是非虚拟的,它们肯定是调用protected部分do_read/do_write虚拟成员函数来完成实际的工作。啊,我简直为自己的进步而飘飘然了!哈,Wendy,这回你可难不住我,还有什么招数?尽管放马过来... 突然,笑容在我脸上凝固,因为我看到了其private部分:
private:
virtual std::string classID() const = 0;
这是什么?一个private纯虚函数,能工作么?我站了起来,
“Wendy,你的Mountie类好像不能工作耶,它有一个private virtual function。”
“你试过了?”她连头都不抬。
“嗯,那倒是没有啦,可是想想也不行啊?我的派生类怎么能override你的private函数呢?” 我嘟囔着。
“嗬,你倒是很确定啊!”Wendy的声音很轻柔,“你怎么老是这也不行,那也不行的,这几个月跟着我你就没学到什么东西吗?小菜鸟。”
真是可恶啊...
“小菜鸟,你全都忘了,访问控制级别跟一个函数是不是虚拟的根本没关系。判断一个函数是动态绑定还是静态绑定是函数调用解析的最后一个步骤。好好读读标准的3.4和5.2.2节吧。”
我完全处于下风,只好采取干扰战术。“好吧,就算你说的不错,我也还是不明白,何必把它设为private?”
“我且问你,倘若你不想让一个类中的成员函数被其他的类调用,应当如何处理?”
“当然是把它设置为private的,” 我回答道。
“那么你去看看我的Mountie类实现,特别是write()函数的实现。”
我正巴不得逃开Wendy那刺人的目光,便转过头去在我的屏幕上搜索,很快,我找到了:
void Mountie::write(std::ostream &Dudley) const
{
Dudley << classID() << std::endl;
do_write(Dudley);
}
嗨,最近卡通片真是看得太多了,居然犯这样的低级失误。还是老是承认吧:“好了,我明白了。classID()是一个实现细节,用来在保存对象时指示具象类的类型,派生类必须覆盖它,所以必须是纯虚的。但是既然是实现细节,就应该设为private的。”
“这还差不多,小菜鸟。”大虾点了点头,“现在给我解释一下为什么do_read()和do_write()是protected的?”
这个问题并不难,我组织了一下就回答:“因为派生类对象需要调用这两个函数的实现来读写其中的基类对象。”
“很好很好,”大虾差不多满意了,“不过,你再解释解释为什么我不把它们设为public的?”
现在我感觉好多了:“因为调用它们的时候必须以一种特定的方式进行。比如do_write()函数,必须先把类型信息写入,再把对象信息写入,这样读取的时候,负责生成对象的模块首先能够知道要读出来的对象是什么类型的,然后才能正确地从流中读取对象信息。”
“聪明啊,我的小菜鸟!”Wendy停顿了一下,“就跟学习外国口语一样,学习C++也不光是掌握语法而已,还必须要掌握大量的惯用法。”
“是啊是啊,我正打算读Coplien的书...”
[译者注:就是James Coplien 1992年的经典著作Advanced C++ Programming Style and Idioms]
大虾挥了挥她的手,“冷静,小菜鸟,我不是指先知Coplien的那本书,我是指某种结构背后隐含的惯用法。比如一个类有virtual destructor,相当于告诉你说:‘嗨,我是一个多态基类,来继承我吧!’ 而如果一个类的destructor不是虚拟的,则相当于是在说:‘我不能作为多态基类,看在老天的份上,别继承我。’”
“同样的,virtual函数的访问控制级别也具有隐含的意义。一个protected virtual function告诉你:‘你写的派生类应该,哦,可是说是必须调用我的实现。’而一个private virtual function是在说:‘派生类可以覆盖,也可以不覆盖我,随你的便。但是你不可以调用我的实现。’”
我点点头,告诉她我懂了,然后追问道:“那么public virtual function呢?”
“尽可能不要使用public virtual function。”她拿起一支笔写下了以下代码:
class HardToExtend
{
public:
virtual void f();
};
void HardToExtend::f()
{
// Perform a specific action
}
“假设你发布了这个类。在写第二版时,需求有所变化,你必须改用Template Method。可是这根本不可能,你知道为什么?”
“呃,这个...,不知道。”
“由两种可能的办法。其一,将f()的实现代码转移到一个新的函数中,然后将f()本身设为non-virtual的:
class HardToExtend
{
// possibly protected
virtual void do_f();
public:
void f();
};
void HardToExtend::f()
{
// pre-processing
do_f();
// post-processing
}
void HardToExtend::do_f()
{
// Perform a specific action
}
然而你原来写的派生类都是企图override函数f()而不是do_f()的,你必须改变所有的派生类实现,只要你错过了一个类,你的类层次就会染上先知Meyers所说的‘精神分裂的行径’。” [译者注:参见Scott Meyers,Effective C++, Item 37,绝对不要重新定义继承而来的非虚拟函数]
“另一种办法是将f()移到private区域,引入一个新的non-virtual函数:”
class HardToExtend
{
// possibly protected
virtual void f();
public:
void call_f();
};
“这会导致无数令人头痛的问题。首先,所有的客户都企图调用f()而不是call_f(),现在它们的代码都不能编译了。更有甚者,大部分派生类都回把f()放在public区域中,这样直接使用派生类的用户可以访问到你本来想保护的细节。”
“对待虚函数要象对待数据成员一样,把它们设为private的,直到设计上要求使用更宽松的访问控制再来调整。要知道由private入public易,由public入private难啊!”
[译者注:这篇文章所表达的思想具有一定的颠覆性,因为我们太容易在基类中设置public virtual function了,Java中甚至专门为这种做法建立了interface机制,现在竟然说这不好!一时间真是接受不了。但是仔细体会作者的意思,他并不是一般地反对public virtual function,只是在template method大背景下给出上述原则。虽然这个原则在一般的设计中也是值得考虑的,但是主要的应用领域还是在template method模式中。当然,template method是一种非常有用和常用的模式,因此也决定了本文提出的原则具有广泛的意义。]
posted @
2006-05-19 07:23 Jerry Cat 阅读(660) |
评论 (1) |
编辑 收藏
/********************************************\
| 欢迎转载, 但请保留作者姓名和原文链接, 祝您进步并共勉! |
\********************************************/
非“伪”随机数的生成
作者: Jerry Cat
时间: 2006/05/16
链接:
http://www.cppblog.com/jerysun0818/archive/2006/05/16/7232.html
问题的来由 - "随机取m个数(在1到n的范围之内),(m <= n),要求m个数没有重复。有没有
什么好的算法,时间复杂度和空间复杂度都很好"
----------------------------------------------------------------
方案一:
取随机数可以用C++标准的rand,至于M个不重复,你可以用std::set来解决,把取道的随机数
插入到set里面,set的size() == m就可以了, 具体可以这样:
#include <set>
#include <stdlib.h>
int main()
{
std::set<int> s;
while(1)
{
int r = rand() % n;
s.insert(r);
if(s.size() == m)
{
break;
}
}
}
由于set底层实现是红黑树,插入复杂度是对数级的^_^
----------------------------------------------------------------
方案二:
#include <iostream>
#include <cstdlib> //用于rand()和srand()函数
#include <ctime> //设置不同的随机数
using namespace std;
int main (){
srand( time( 0 ) ); //调用不重复的随机数函数
unsigned i;
for ( int n = 0; n++ < 10; )
{
i = rand() ; //对i 赋系统的随机数
cout << " The NO." << n << "is : " << i << endl;
}
return 0;
}
1. C++标准函数库提供一随机数生成器rand,返回0-RAND_MAX之间均匀分布的伪随机整数。 RAND_MAX
必须至少为32767。rand()函数不接受参数,默认以1为种子(即起始值)。
随机数生成器总是以相同的种子开始,所以形成的伪随机数列也相同。失去了随机意义。
2. C++中另一函数srand(),可以指定不同的数(无符号整数变元)为种子。但是如果种子相同,伪
随机数列也相同。--一个办法是让用户输入种子,但是仍然不理想。
3. 比较理想的是用变化的数,比如时间来作为随机数生成器的种子。
在 头文件ctime中时间库包含time函数,它可以返回一个表示时间、日期、月和年的数值使用如
下调用可将该值设为rand的种子
srand(static_cast<unsigned>(time(static_cast<time_t*>(NULL))));
4. 但, srand()并不是说使随机数都不一样,它只是使取随机数的种子随着时间而改变:)
So, 还是方案一好!
posted @
2006-05-16 00:17 Jerry Cat 阅读(2501) |
评论 (7) |
编辑 收藏
/********************************************\
| 欢迎转载, 但请保留作者姓名和原文链接, 祝您进步并共勉! |
\********************************************/
作者: Jerry Cat
时间: 2006/05/16
链接: http://www.cppblog.com/jerysun0818/archive/2006/05/16/7231.html
类成员函数指针的一点体悟
类的成员函数分为两种,一种是静态函数,另外一种是非静态函数。例如:
class X
{
public:
static void display();
bool getValue();
}
display()为静态函数,getValue即为非静态函数。两种函数在使用的时候是不一样的。静态函数
可以直接由类名来调用,而非静态函数则必须通过某一个对象来调用,例如:
X::display();
X x;
x.getValue();
为什么会出现这样的情况了?这是由于编译器在处理这两种函数的方式不同造成的。静态函数在
运行期只有一份拷贝,所有该类生成的对象共享该函数以及该函数的内部变量。而对于非静态函数,
不同的对象拥有自己的内部变量。
在使用类成员函数指针的时候同样也会不同。
静态成员函数可以当作全局函数来调用。
可以定义以下函数指针:
typedef void (*pf)();
pf p=X::display;
(*p)(); //或p();
也可以当作参数传递到全局函数里:
void Display(pf p)
{
(*p)();
//或p();
}
Display(X::display);
如果是非静态成员函数,其函数指针则是另一种写法:
typedef void (X::*pf2)();
这一类指针只能用于本类之内。
posted @
2006-05-16 00:12 Jerry Cat 阅读(1111) |
评论 (2) |
编辑 收藏
/********************************************\
| 欢迎转载, 但请保留作者姓名和原文链接, 祝您进步并共勉! |
\********************************************/
C++对象模型(7) - Member Initialization List
作者: Jerry Cat
时间: 2006/05/12
链接:
http://www.cppblog.com/jerysun0818/archive/2006/05/12/6978.html
2.4 Member Initialization List
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
When you write a constructor, you have the option of initializing class members either through the
member initialization list or within the body of the constructor. Except in four cases, which one
you choose is not significant.
In this section, I first clarify when use of the initialization list is "significant" and then
explain what actually gets done with that list internally. I then look at a number of possible,
subtle pitfalls.
You must use the member initialization list in the following cases in order for your program to compile:
(1). When initializing a reference member
(2). When initializing a const member
(3). When invoking a base or member class constructor with a set of arguments
低效的第四种情况
In the fourth case, the program compiles and executes correctly. But it does so inefficiently.
For example, given
class Word {
String _name;
int _cnt;
public:
// not wrong, just naive ...
Word() {
_name = 0;
_cnt = 0;
}
};
this implementation of the Word constructor initializes _name once, then overrides the
initialization with an assignment, resulting in the creation and the destruction of a temporary
String object. Was this intentional? Unlikely. Does the compiler generate a warning? I'm not aware
of any that does. Here is the likely internal augmentation of this constructor:
// Pseudo C++ Code
Word::Word( /* this pointer goes here */ )
{
_name.String::String(); // invoke default String constructor
String temp = String( 0 ); // generate temporary
_name.String::operator=( temp );// memberwise copy _name
temp.String::~String(); // destroy temporary
_cnt = 0;
}
Had the code been reviewed by the project and corrected, a significantly more efficient
implementation would have been coded:
// preferred implementation
Word::Word : _name( 0 )
{
_cnt = 0;
}
This expands to something like this:
// Pseudo C++ Code
Word::Word( /* this pointer goes here */ )
{ // invoke String( int ) constructor
_name.String::String( 0 );
_cnt = 0;
}
This pitfall, by the way, is most likely to occur in template code of this form:
template < class type >
foo< type >::foo( type t )
{
// may or may not be a good idea depending on the actual type of type
_t = t;
}
This has led some programmers to insist rather aggressively that all member initialization be done
within the member initialization list, even the initialization of a well-behaved member such as _cnt:
// some insist on this coding style, 顺序有问题!
Word::Word() : _cnt( 0 ), _name( 0 )
{}
Actually, there is a subtlety to note here: The order in which the list entries are set down is
determined by the declaration order of the members within the class declaration, not the order
within the initialization list. In this case, _name is declared before _cnt in Word and so is placed first.
This apparent anomaly between initialization order and order within the initialization list can
lead to the following nasty pitfall:
class X {
int i;
int j;
public:
// oops! do you see the problem?
X( int val ) : j( val ), i( j )
{}
...
};
// preferred idiom, 解决咯
X::X( int val ) : j( val )
{
i = j;
}
Here is an interesting question: Are the entries in the initialization list entered such that the
declaration order of the class is preserved? That is, given
// An interesting question is asked:
X::X( int val ) : j( val )
{
i = j;
}
is the initialization of j inserted before or after the explicit user assignment of j to i? If
the declaration order is preserved, this code fails badly. The code is correct, however, 这才是
真正的原因 - because the initialization list entries are placed before explicit user code.
所以成员初始化不是一股脑儿都放到初始化列表里才是最优方案!
Another common question is whether you can invoke a member function to initialize a member, such as
// is the invocation of X::xfoo() ok? 问得好!
X::X( int val ) : i( xfoo( val )), j( val )
{}
where xfoo() is a member function of X. The answer is yes, but…. To answer the "but" first, I
reiterate my advice to initialize one member with another inside the constructor body, not in the
member initialization list. You don't know the dependencies xfoo() has regarding the state of the
X object to which it is bound. 还是那句话: 别将所有的成员初始化工作全放在构造函数的初始化列表里 -
By placing xfoo() within the constructor body, you can ensure there is no ambiguity about which
members are initialized at the point of its invocation.
The use of the member function is valid (apart from the issue of whether the members it accesses
have been initialized). This is because the this pointer associated with the object being
constructed is well formed and the expansion simply takes a form like the following:
// Pseudo C++ Code: constructor augmentation
X::X( /* this pointer, */ int val )//一般都将this指针缺省, 但它的确是存在的, 至少对编译器而言
{
i = this->xfoo( val );
j = val;
}
where xfoo() is a member function of X. The answer is yes, but…. To answer the "but" first, I
reiterate my advice to initialize one member with another inside the constructor body, not in the
member initialization list. You don't know the dependencies xfoo() has regarding the state of the
X object to which it is bound. By placing xfoo() within the constructor body, you can ensure
there is no ambiguity about which members are initialized at the point of its invocation.
The use of the member function is valid (apart from the issue of whether the members it accesses
have been initialized). This is because the this pointer associated with the object being
constructed is well formed and the expansion simply takes a form like the following:
// Pseudo C++ Code: constructor augmentation
X::X( /* this pointer, */ int val )
{
i = this->xfoo( val );
j = val;
}
In summary, the compiler iterates over and possibly reorders the initialization list to reflect
the declaration order of the members. It inserts the code within the body of the constructor
prior to any explicit user code. 成员初始化列表的内容"插"在构造函数的最前端.
posted @
2006-05-12 00:49 Jerry Cat 阅读(749) |
评论 (0) |
编辑 收藏