Windows Server与客户端的带外编程识别

时间:2012-05-11 03:17:59

标签: windows kernel windows-server computer-forensics

我有一些独立的C ++代码(即不是Windows程序)需要识别PC上安装的Windows版本。

我可以通过内核版本轻松区分不同的Windows客户端版本(例如ntoskrnl.exe上的GetFileVersionInfo),但是我想知道是否有可靠的方法来区分客户端和服务器安装。

使用此方法区分Windows Vista SP2和Windows Server 2008 SP2(6.0 build 6002两者)和Windows 7和Windows Server 2008 R2(6.1 build 7600 for RTM和6.1 build 7601 for SP2)时出现问题,两个)。对于在环境外运行的代码,正确识别客户端与服务器操作系统的方法是什么是可靠的(并且最好尽可能直接,避免注册表会很好,因为访问Win32 API不可用)?

我想我可以检查服务器版本上只存在的文件(无论配置如何,保证在任何服务器版本安装上保证什么是好文件?),检查Panther文件夹(可以安全删除,所以不保证那些)但是我确定这是一个人们已经遇到的问题,并且(希望)更优雅地解决了?

(旁注:此问题已被问及on SO before,但解决方案(WMI)不适用于带外检查)

3 个答案:

答案 0 :(得分:0)

我不完全确定你对带外检查的意思,所以我暂时不理会这一点。

通常的方法是致电GetVersionEx,然后查看OSVERSIONINFOEXwProductType成员。

答案 1 :(得分:0)

PE图像不指定图像是否应在客户端或服务器上运行。它仅指定有关子系统,依赖关系,内存,关联性等的运行时要求......

答案 2 :(得分:0)

我最终在system32目录中搜索了许多通常与Windows Server版相关联的二进制文件。它不是很干净,但在实践中效果很好。