windows下硬件信息的另一种方式获取
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了windows下硬件信息的另一种方式获取相关的知识,希望对你有一定的参考价值。
通过命令方式
TCHAR szFetCmd[] = _T("wmic baseboard get serialnumber");
可以有:
查找主板厂商和型号
wmic BaseBoard get Manufacturer
wmic BaseBoard get Product
先决条件:
a. 启动Windows Management Instrumentation服务,开放TCP135端口。
b. 本地安全策略的“网络访问: 本地帐户的共享和安全模式”应设为“经典-本地用户以自己的身份验证”。
- wmic /node:"192.168.1.20" /user:"domainadministrator" /password:"123456"
2.【硬件管理】:
获取磁盘资料:
wmic DISKDRIVE get deviceid,Caption,size,InterfaceType
获取分区资料:
wmic LOGICALDISK get name,Description,filesystem,size,freespace
获取CPU资料:
wmic cpu get name,addresswidth,processorid
获取主板资料:
wmic BaseBoard get Manufacturer,Product,Version,SerialNumber
获取内存数:
wmic memlogical get totalphysicalmemory
获得品牌机的序列号:
wmic csproduct get IdentifyingNumber
获取声卡资料:
wmic SOUNDDEV get ProductName
获取屏幕分辨率
wmic DESKTOPMONITOR where Status=‘ok‘ get ScreenHeight,ScreenWidth
- PROCESS【进程管理】:
列出进程
wmic process list brief
(Full显示所有、Brief显示摘要、Instance显示实例、Status显示状态)
wmic 获取进程路径:
wmic process where name="jqs.exe" get executablepath
wmic 创建新进程
wmic process call create notepad
wmic process call create "C:Program FilesTencentQQQQ.exe"
wmic process call create "shutdown.exe -r -f -t 20"
wmic 删除指定进程:
wmic process where name="qq.exe" call terminate
wmic process where processid="2345" delete
wmic process 2345 call terminate
wmic 删除可疑进程
wmic process where "name=‘explorer.exe‘ and executablepath<>‘%SystemDrive%windowsexplorer.exe‘" delete
wmic process where "name=‘svchost.exe‘ and ExecutablePath<>‘C:WINDOWSsystem32svchost.exe‘" call Terminate
- USERACCOUNT【账号管理】:
更改当前用户名
WMIC USERACCOUNT where "name=‘%UserName%‘" call rename newUserName
WMIC USERACCOUNT create /?
- SHARE【共享管理】:
建立共享
WMIC SHARE CALL Create "","test","3","TestShareName","","c: est",0
(可使用 WMIC SHARE CALL Create /? 查看create后的参数类型)
删除共享
WMIC SHARE where name="C$" call delete
WMIC SHARE where path=‘c: est‘ delete
- SERVICE【服务管理】:
更改telnet服务启动类型[Auto|Disabled|Manual]
wmic SERVICE where name="tlntsvr" set startmode="Auto"
运行telnet服务
wmic SERVICE where name="tlntsvr" call startservice
停止ICS服务
wmic SERVICE where name="ShardAccess" call stopservice
删除test服务
wmic SERVICE where name="test" call delete
- FSDIR【目录管理】
列出c盘下名为test的目录
wmic FSDIR where "drive=‘c:‘ and filename=‘test‘" list
删除c:good文件夹
wmic fsdir "c: est" call delete
重命名c: est文件夹为abc
wmic fsdir "c: est" rename "c:abc"
wmic fsdir where (name=‘c: est‘) rename "c:abc"
复制文件夹
wmic fsdir where name=‘d: est‘ call copy "c: est"
7.datafile【文件管理】
重命名
wmic datafile "c: est.txt" call rename c:abc.txt
8.【任务计划】:
wmic job call create "notepad.exe",0,0,true,false,****154800.000000+480
wmic job call create "explorer.exe",0,0,1,0,****154600.000000+480
// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <string>
#include <windows.h>
BOOL GetMainBoardInfoByCmd(char* & lpszBaseBoard)
{
const long COMMAND_SIZE = 1020; // Command line output buffer
const DWORD WAIT_TIME = 500; // INFINITE
// The command to get mainboard serial number
TCHAR szFetCmd[] = _T("wmic baseboard get serialnumber");
// Pre- information of mainboard serial number
const std::string strEnSearch = "SerialNumber";
BOOL fReturnCode = FALSE;
HANDLE hReadPipe = NULL; // Pipeline for READ
HANDLE hWritePipe = NULL; // Pipeline for WRITE
PROCESS_INFORMATION pi; // Process information
STARTUPINFO si; // Control-command window info
SECURITY_ATTRIBUTES sa; // Security attributes
char szBuffer[COMMAND_SIZE + 1] = { 0 }; // Command line output buffer
std::string strBuffer;
DWORD count = 0;
size_t pos = 0;
size_t i = 0;
size_t j = 0;
lpszBaseBoard = (char*)malloc((COMMAND_SIZE + 1) * sizeof(char));
memset(lpszBaseBoard, 0x00, (COMMAND_SIZE + 1) * sizeof(char));
memset(&pi, 0, sizeof(pi));
memset(&si, 0, sizeof(si));
memset(&sa, 0, sizeof(sa));
pi.hProcess = NULL;
pi.hThread = NULL;
si.cb = sizeof(STARTUPINFO);
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
// Step 1: Create pipeline
fReturnCode = CreatePipe(&hReadPipe, &hWritePipe, &sa, 0);
if (!fReturnCode)
{
goto EXIT;
}
// Step 2: Set command line window to be specific READ / WRITE pipeline
GetStartupInfo(&si);
si.hStdError = hWritePipe;
si.hStdOutput = hWritePipe;
si.wShowWindow = SW_HIDE; // hide command line window
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
// Step 3: Create process to get command line handle
fReturnCode = CreateProcess(NULL, szFetCmd, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);
if (!fReturnCode)
{
goto EXIT;
}
// Step 4: Get return back data
WaitForSingleObject(pi.hProcess, WAIT_TIME);
fReturnCode = ReadFile(hReadPipe, szBuffer, COMMAND_SIZE, &count, 0);
if (!fReturnCode)
{
goto EXIT;
}
// Step 5: Search for mainboard serial number
fReturnCode = FALSE;
strBuffer = szBuffer;
pos = strBuffer.find(strEnSearch);
if (pos < 0) // NOT FOUND
{
goto EXIT;
}
else
{
strBuffer = strBuffer.substr(pos + strEnSearch.length());
}
memset(szBuffer, 0x00, sizeof(szBuffer));
strcpy_s(szBuffer, strBuffer.c_str());
// Get ride of <space>,
,
j = 0;
for (i = 0; i < strlen(szBuffer); i++)
{
if (szBuffer[i] != ‘ ‘ && szBuffer[i] != ‘
‘ && szBuffer[i] != ‘
‘)
{
lpszBaseBoard[j] = szBuffer[i];
j++;
}
}
fReturnCode = TRUE;
EXIT:
CloseHandle(hWritePipe);
CloseHandle(hReadPipe);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return(fReturnCode);
}
int main()
{
char* lpszMainBoardSN = NULL;
GetMainBoardInfoByCmd(lpszMainBoardSN);
if (lpszMainBoardSN)
{
printf("%s
", lpszMainBoardSN);
free(lpszMainBoardSN);
lpszMainBoardSN = NULL;
}
else
{
printf("N/A
");
}
getchar();
return 0;
}
cpu有
#include <windows.h>
#include <iostream>
#include <string>
using namespace std;
//用来存储eax,ebx,ecx,edx四个寄存器的信息
DWORD deax;
DWORD debx;
DWORD decx;
DWORD dedx;
void ExeCPUID(DWORD veax) //初始化CPU
{
__asm
{
mov eax,veax
cpuid
mov deax,eax
mov debx,ebx
mov decx,ecx
mov dedx,edx
}
}
/* 在Intel Pentium以上级别的CPU中,有一个称为“时间戳(Time Stamp)”的部件,
它以64位无符号整型数的格式,记录了自CPU上电以来所经过的时钟周期数。
由于目前的CPU主频都非常高,因此这个部件可以达到纳秒级的计时精度。
这个精确性是上述两种方法所无法比拟的。
在Pentium以上的CPU中,提供了一条机器指令RDTSC(Read Time Stamp Counter)
来读取这个时间戳的数字,并将其保存在EDX:EAX寄存器对中
*/
long GetCPUFreq() //获取CPU频率,单位: MHZ
{
int start,over;
_asm
{
RDTSC
mov start,eax
}
Sleep(50);
_asm
{
RDTSC
mov over,eax
}
return (over-start)/50000;
}
/* 把eax = 0作为输入参数,可以得到CPU的制造商信息。
cpuid指令执行以后,会返回一个12字符的制造商信息,
前四个字符的ASC码按低位到高位放在ebx,中间四个放在edx,最后四个字符放在ecx。
*/
string GetManID() //获取制造商信息
{
char ID[25];
memset(ID,0,sizeof(ID));
ExeCPUID(0); //初始化
memcpy(ID+0,&debx,4); //制造商信息复制到数组
memcpy(ID+4,&dedx,4);
memcpy(ID+8,&decx,4);
return string(ID);
}
/* 在我的电脑上点击右键,选择属性,可以在窗口的下面看到一条CPU的信息,
这就是CPU的商标字符串。CPU的商标字符串也是通过cpuid得到的。
由于商标的字符串很长(48个字符),所以不能在一次cpuid指令执行时全部得到,
所以intel把它分成了3个操作,eax的输入参数分别是0x80000002,0x80000003,0x80000004,
每次返回的16个字符,按照从低位到高位的顺序依次放在eax, ebx, ecx, edx。
因此,可以用循环的方式,每次执行完以后保存结果,然后执行下一次cpuid。
*/
string GetCPUType()
{
const DWORD id = 0x80000002; //从0x80000002开始,到0x80000004结束
char CPUType[49];//用来存储CPU型号信息
memset(CPUType,0,sizeof(CPUType));//初始化数组
for(DWORD t = 0 ; t < 3 ; t++ )
{
ExeCPUID(id+t);
//每次循环结束,保存信息到数组
memcpy(CPUType+16*t+ 0,&deax,4);
memcpy(CPUType+16*t+ 4,&debx,4);
memcpy(CPUType+16*t+ 8,&decx,4);
memcpy(CPUType+16*t+12,&dedx,4);
}
return string(CPUType);
}
void main()
{
cout<<"本机CPU信息如下:"<<endl;
cout<<"CPU 主 频: "<<GetCPUFreq()<<" MHZ"<<endl;
cout<<"CPU 制造商: "<<GetManID()<<endl;
cout<<"CPU 型 号: "<<GetCPUType()<<endl;
cin.get();
}
Win32_baseboard 主板 参数说明
Caption --简短说明
ConfigOptions --数组,表示位于在底板上跳线和开关的配置。
CreationClassName --表示类的名称(就是Win32_baseboard类)
Depth --以英寸为单位的物理封装。
Description --对象的描述(底板)
Height --用英寸表示的物理包的高度
HostingBoard --如果为TRUE,该卡是一个主板,或在一个机箱中的基板。
HotSwappable --如果为TRUE,就是支持热插拔(判断是否支持热插拔)
InstallDate --日期和时间对象安装。此属性不需要的值以表示已安装的对象。
Manufacturer --表示制造商的名称
Model --物理元素的名称是已知。
Name --对象的名称标签
OtherIdentifyingInfo --捕获附加数据,超出资产标签的信息,可以用来标识物理元件
PartNumber --由负责生产或制造的物理元素的组织分配部件编号。
PoweredOn --如果为真,物理元素处于开机状态。
Product --产品的型号
Removable --判断是否可拆卸的
Replaceable --判断是否可更换的
RequirementsDescription --自由格式字符串描述方式,这张卡是身体不同于其他卡。该属性才有意义时,相对应的布尔值属性特殊要求是集真的
RequiresDaughterBoard --如果是TRUE,至少一个子板或辅助卡才能正常工作。
SerialNumber --制造商分配的用于识别所述物理元件数目。
SKU --库存的物理单元号。
SlotLayout --描述插槽位置
SpecialRequirements --如果为真,此卡是同类型的其他卡物理上唯一的,因此需要一个专门的插槽
Status --对象的当前状态。
Tag --符系统的基板唯一标识
Version --物理元素的版本
Weight --物理元素的重量英镑表示
Width --用英寸表示的物理元素的宽度
参考:
https://bbs.pediy.com/thread-225735.htm
以上是关于windows下硬件信息的另一种方式获取的主要内容,如果未能解决你的问题,请参考以下文章