哪位高手知道不通过读取注册表,如何获得WINDOWS的产品ID

ahejn 2004-08-10 04:12:22
如题,不是通过读取注册表方式获得.所谓ID,就是从我的电脑 右键 属性里看到的那一串类似 55661-011- ............. 的数字
...全文
1058 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
geland 2004-08-21
  • 打赏
  • 举报
回复
调用WMI必须做这些事情,初始化COM,连接到名字空间,再得到某个提供类的实例,MSDN 上有例子。
ahejn 2004-08-21
  • 打赏
  • 举报
回复
楼上,这是托管代码吧,我VC不太熟悉。这段代码我看到过,发现很复杂。
能否给一个相对简单的例子,就比如读取PRODUCT ID。
麻烦您了。
oyljerry 2004-08-21
  • 打赏
  • 举报
回复
嗯,2000下可以直接修改注册表得到
geland 2004-08-19
  • 打赏
  • 举报
回复

HRESULT ConnectServerWMI ( OUT IWbemLocator** ppiWmiLoc ,
OUT IWbemServices** ppiWmiServ ,
const char* csNamespace ,
const char* csUsername ,
const char* csPassword )
{
if (NULL == ppiWmiServ || NULL == ppiWmiLoc) {
printf("Invalid argument\n");
return E_INVALIDARG;
}

HRESULT hres;
hres = CoCreateInstance ( CLSID_WbemLocator, 0,
CLSCTX_INPROC_SERVER, IID_IWbemLocator ,
(LPVOID *) ppiWmiLoc );

if (FAILED(hres)) {
DisplayError(TEXT("CoCreateInstance"),GetLastError());
return hres;
}

CComBSTR bstrNamespace(csNamespace);

if (!csPassword || !csUsername)
{
hres = (*ppiWmiLoc)->ConnectServer(bstrNamespace, NULL, NULL ,
0, NULL, 0, 0, ppiWmiServ );
}
else
{
// connect server using password and username
CComBSTR bstrUsername(csUsername), bstrPassword(csPassword);

hres = (*ppiWmiLoc)->ConnectServer(bstrNamespace, bstrUsername,
bstrPassword, 0, NULL, 0, 0,
ppiWmiServ );
}

if (FAILED(hres))
{
(*ppiWmiLoc)->Release();
DisplayError(TEXT("ConnectServer"),GetLastError());
return hres;
}


hres = CoSetProxyBlanket( *ppiWmiServ ,
RPC_C_AUTHN_WINNT ,
RPC_C_AUTHZ_NONE ,
NULL,
RPC_C_AUTHN_LEVEL_CALL ,
RPC_C_IMP_LEVEL_IMPERSONATE ,
NULL,
EOAC_NONE);

if(FAILED(hres))
{
(*ppiWmiLoc)->Release();
(*ppiWmiServ)->Release();
DisplayError(TEXT("CoSetProxyBlanket"),GetLastError());
return hres;
}

return hres;
}

HRESULT GetLastErrorWMI (string& csErrRef, HRESULT hresErr)
{
IWbemStatusCodeText * pStatus = NULL;

HRESULT hres = CoCreateInstance(CLSID_WbemStatusCodeText, 0, CLSCTX_INPROC_SERVER,
IID_IWbemStatusCodeText, (LPVOID *) &pStatus);

if(S_OK == hres)
{
CComBSTR bstrError;
hres = pStatus->GetErrorCodeText(hresErr, 0, 0, &bstrError);

if(S_OK != hres)
bstrError = SysAllocString(L"Get last error failed");

USES_CONVERSION;
csErrRef = OLE2T(bstrError);

pStatus->Release();
}

return hres;
}

HRESULT EnumInstancesWMI ( IN IWbemServices* piWmiServ ,
OUT IEnumWbemClassObject** ppiWmiEnum ,
const char* csInstName )
{
if (NULL == piWmiServ || NULL == ppiWmiEnum)
{
printf("Invalid argument\n");
return E_INVALIDARG;
}

HRESULT hres;
CComBSTR bstrObjectName(csInstName);

hres = piWmiServ->CreateInstanceEnum( bstrObjectName ,
WBEM_FLAG_RETURN_IMMEDIATELY | WBEM_FLAG_FORWARD_ONLY ,
NULL ,
ppiWmiEnum);
if (FAILED(hres))
{
DisplayError(TEXT("CreateInstanceEnum"),GetLastError());
return hres;
}
return hres;
}

static
HRESULT EnumInstPropNameWMI ( IN IWbemClassObject* piappObj,
OUT LPSAFEARRAY* ppsarProp )
{
if (NULL == ppsarProp || NULL == piappObj)
{
printf("Invalid argument\n");
return E_INVALIDARG;
}
// GetNames methods will create SAFEARRAY,
// but on entry this parameter must point to NULL
if (NULL != *ppsarProp)
{
SafeArrayDestroy(*ppsarProp);
delete *ppsarProp;
*ppsarProp = NULL;

if (NULL == ppsarProp)
return E_INVALIDARG;
}

HRESULT hres;
hres = piappObj->GetNames( NULL,
WBEM_FLAG_ALWAYS | WBEM_FLAG_NONSYSTEM_ONLY,
NULL,
ppsarProp);
return hres;
}

HRESULT EnumInstPropNameWMI ( IN IWbemClassObject* piappObj,
OUT ArgVector& psarPropRef )
{
HRESULT hres;
SAFEARRAY* pSafeArrProp = NULL;

psarPropRef.clear();

hres = EnumInstPropNameWMI(piappObj, &pSafeArrProp );

if (WBEM_S_NO_ERROR != hres)
return hres;

long lLower, lUpper;
SafeArrayGetLBound(pSafeArrProp , 1, &lLower);
SafeArrayGetUBound(pSafeArrProp , 1, &lUpper);

for (long i = lLower; i <= lUpper; ++i)
{
CComBSTR bstrPropName;

if (S_OK != (hres = SafeArrayGetElement(pSafeArrProp, &i, &bstrPropName)) )
{
if (NULL != pSafeArrProp)
SafeArrayDestroy(pSafeArrProp);
return hres;
}

USES_CONVERSION;
psarPropRef.push_back( OLE2T(bstrPropName) );

}

if (NULL != pSafeArrProp)
SafeArrayDestroy(pSafeArrProp);

return hres;
}

HRESULT ExecMethodWMI ( IN IWbemServices* piWmiServ ,
const char* csMethodName,
const char* csClassName ,
const char* csClassPath ,
const char* csObjectPath,
const ArgVector* csarrPropNames /*=NULL*/,
VARIANT* arrVarInArg/*=NULL*/,
const int size_t/*=0*/)
{
// sanity checks
if (NULL == piWmiServ)
{
printf("Invalid argument\n");
return E_INVALIDARG;
}

if (( NULL != csarrPropNames && NULL == arrVarInArg) ||
( NULL == csarrPropNames && NULL != arrVarInArg) )
{
printf("Invalid argument\n");
return E_INVALIDARG;
}

if (NULL != csarrPropNames)
{
if(size_t != (*csarrPropNames).size())
return E_INVALIDARG;
}

IWbemClassObject* pClassObj = NULL;
IWbemClassObject* pOutParam = NULL;
IWbemClassObject* pInParam = NULL;

IWbemClassObject* pInClass = NULL;
IWbemClassObject* pOutClass = NULL;
IWbemCallResult* pCallRrs = NULL;

CComBSTR bstrMethodName ( csMethodName);
CComBSTR bstrClassName ( csClassName );
CComBSTR bstrClassPath ( csClassPath );
CComBSTR bstrObjectPath ( csObjectPath);

HRESULT hres;
hres = piWmiServ->GetObject(bstrClassName, 0, NULL, &pClassObj, NULL);

if (WBEM_S_NO_ERROR == hres)
{
// get the input-argument class object and create an instance.
// pInClass == NULL indicates that no input parameters needed.
hres = pClassObj->GetMethod(bstrMethodName, 0, &pInClass, NULL);

if (WBEM_S_NO_ERROR == hres)
{
if( NULL != pInClass)
{
// create instance copy
if(WBEM_S_NO_ERROR == (hres=pInClass->SpawnInstance(0, &pInParam)) )
{
// set each property
for (long i = 0; i < size_t; ++i)
{
CComBSTR bstrPropName( (*csarrPropNames)[i].c_str() );
hres = pInParam->Put(bstrPropName, 0, &arrVarInArg[i], 0);

// DUF!!! Put failed, check the properties and their types
if (WBEM_S_NO_ERROR != hres)
break;
}
}
}
// finally call the method
if (WBEM_S_NO_ERROR == hres)
{
hres = piWmiServ->ExecMethod(bstrObjectPath,
bstrMethodName,
0,
NULL,
pInParam,
&pOutParam,
&pCallRrs);
}
}
}

// free all resources
if (NULL != pOutParam)
{
// but first we get the output parameters here
CComBSTR bstrClassObj;
hres = pOutParam->GetObjectText(0, &(bstrClassObj.m_str));

USES_CONVERSION;

printf("\n\nThe object text of the output object is:\n%s", OLE2T(bstrClassObj));

pOutParam->Release();
}

if (NULL != pClassObj) pClassObj->Release();

if (NULL != pInParam) pInParam->Release();

if (NULL != pInClass) pInClass->Release();

if (NULL != pOutClass) pOutClass->Release();

return hres;
}

HRESULT GetClassMethodsWMI ( IN IWbemClassObject* piappObj,
OUT ArgVector& csarrMethods)
{

if (NULL == piappObj)
return E_INVALIDARG;

csarrMethods.clear();

USES_CONVERSION;

HRESULT hres;
hres = piappObj->BeginMethodEnumeration(0);

while(WBEM_S_NO_ERROR == hres)
{
CComBSTR bstrMethodName;
hres = piappObj->NextMethod(0, &bstrMethodName, NULL, NULL);

if (WBEM_S_NO_ERROR == hres)
csarrMethods.push_back(OLE2T(bstrMethodName));

}

return piappObj->EndMethodEnumeration();
}

geland 2004-08-19
  • 打赏
  • 举报
回复

#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0400
#endif

#include <windows.h>
#include <comdef.h>
#include <Wbemidl.h>
#include <atlbase.h>
#include <tchar.h>
#include <vector>
#include <string>

using std::string;

typedef std::vector<std::string> ArgVector;

#ifndef OUT
#define OUT
#endif

#ifndef IN
#define IN
#endif

//
//错误信息显示函数
//
void DisplayError( LPTSTR szAPI, DWORD dwError );

//
//连接到指定的名字空间
//
HRESULT ConnectServerWMI (OUT IWbemLocator** ppiWmiLoc ,//接收初始化后的IWbemLocator指针
OUT IWbemServices** ppiWmiServ ,//接收初始化后的IWbemServices指针
const char* csNamespace ,//名字空间
const char* csUsername ,//用户名
const char* csPassword //用户口令
);

//
//得到一个类的枚举实例
//
HRESULT EnumInstancesWMI (IN IWbemServices* piWmiServ ,//已经初始化的IWbemServices指针
OUT IEnumWbemClassObject** ppiWmiEnum ,//接收初始化后的IEnumWbemClassObject指针
const char* csInstName //提供类实例的名称
);

//
//取得最后的错误信息
//
HRESULT GetLastErrorWMI (OUT string& csErrRef, //接收初始化后的错误信息
IN HRESULT hresErr //错误码
);

//
//枚举类的属性名列表
//
HRESULT EnumInstPropNameWMI ( IN IWbemClassObject* piappObj, //初始化后的IWbemClassObject指针
OUT ArgVector& psarPropRef//接收属性列表的变量
);


//HRESULT EnumInstPropNameWMI ( IN IWbemClassObject* piappObj,
// OUT LPSAFEARRAY* psarProp );

//
//在一个类上执行方法
//
HRESULT ExecMethodWMI (IN IWbemServices* piWmiServ ,//初始化后的IWbemServices指针
const char* csMethodName,//方法名
const char* csClassName ,//类名
const char* csClassPath ,//类的路径,
const char* csObjectPath,//对象的路径(ie:\\namespace\root\CIMV2:Win32_Process.Handle="1556")
const ArgVector* csarrPropNames = NULL,//属性名列表
VARIANT* arrVarInArg = NULL,//参数列表
const int size_t = 0//参数个数
);

//
//取得一个提供类的方法名列表
//
HRESULT GetClassMethodsWMI (IN IWbemClassObject* piappObj, //初始化后的IWbemClassObject指针
OUT ArgVector& csarrMethods //接收方法列表的变量
);


//
//Win32_Process:Create() pass
//Win32_Process:Terminate() pass
//
int main(int argc, char* argv[])
{
HRESULT hr;
IWbemLocator* piWmiLoc=NULL;
IWbemServices* piWmiServ=NULL;
IEnumWbemClassObject* piWmiEnum=NULL;
IWbemClassObject* pClass = NULL;

// Initialize COM and connect up to CIMOM

hr = CoInitialize(0);
if (FAILED(hr))
{
printf("CoInitialize returned 0x%x:", hr);
return 1;
}
hr=ConnectServerWMI(&piWmiLoc,&piWmiServ,"root\\CIMV2",0,0);
if(FAILED(hr))
{
printf("ConnectServerWMI fail!\n");
CoUninitialize();
return 1;
}

// hr=EnumInstancesWMI(piWmiServ,&piWmiEnum,"Win32_SystemDriver");
hr=EnumInstancesWMI(piWmiServ,&piWmiEnum,argv[1]);
if(FAILED(hr))
{
printf("EnumInstancesWMI fail!\n");
CoUninitialize();
return 1;
}

//show all instance
while(WBEM_S_NO_ERROR==hr)
{
ULONG uReturned;
IWbemClassObject* apObj;

hr = piWmiEnum->Next( WBEM_INFINITE, 1, &apObj, &uReturned );

if ( SUCCEEDED( hr ) && 1 == uReturned)
{
BSTR bstrObj;
HRESULT hres;
hres = apObj->GetObjectText(0, &bstrObj);
if (SUCCEEDED( hres ))
{
wprintf(L"%s\n",bstrObj);
}
SysFreeString(bstrObj);
}

}
CoUninitialize();
return 0;
}

void DisplayError( LPTSTR szAPI, DWORD dwError )
{
LPTSTR lpBuffer = NULL;

FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM, NULL, dwError,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &lpBuffer, 0, NULL );

_tprintf( TEXT("%s failed:\n"), szAPI );
_tprintf( TEXT(" error code = %d\n"), dwError );
_tprintf( TEXT(" message = %s\n"), lpBuffer );

LocalFree( lpBuffer );
}
ahejn 2004-08-18
  • 打赏
  • 举报
回复
geland老兄能否给出一段vc下面使用WMI的示例代码,我只找到了一段.NET下面的托管代码示例,万分感谢。
geland 2004-08-16
  • 打赏
  • 举报
回复
具体WMI读出来的是不是注册表值我也不清楚,WMI应该有自己的数据库,但是不是和注册表有什么联系,不知道!
ahejn 2004-08-16
  • 打赏
  • 举报
回复
再顶,没有高手帮忙就结贴啦。
ahejn 2004-08-14
  • 打赏
  • 举报
回复
楼上那位仁兄,不知道WMI读出来的是不是注册表值,我的是XP,修改了注册表键发现系统属性里ID没有改变,我怀疑是不是有什么隐藏的API?
taianmonkey 2004-08-13
  • 打赏
  • 举报
回复
HKEY hKey = NULL;
TCHAR tcProductType[MAX_PATH];
DWORD dwBufLen;

RegOpenKeyEx( HKEY_LOCAL_MACHINE,
"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion",
0, KEY_QUERY_VALUE, &hKey );

RegQueryValueEx( hKey, "ProductID", NULL, NULL,
(LPBYTE)tcProductType, &dwBufLen);

RegCloseKey( hKey );

AfxMessageBox(tcProductType);
tabris17 2004-08-13
  • 打赏
  • 举报
回复
2000也是放在注册表中的

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductId


我改了这个值,系统属性中的值也相应变了
geland 2004-08-13
  • 打赏
  • 举报
回复
可以用WMI ,读取Win32_OperatingSystem类的SerialNumber字段值就是你要的东东!
蒋晟 2004-08-13
  • 打赏
  • 举报
回复
98是存在注册表里面的,2000是存在INI里面的,XP不知道
ahejn 2004-08-11
  • 打赏
  • 举报
回复
顶一下先,因为修改注册表中的PRODUCT ID后,发现在系统属性里的产品ID并没有相应改变,说明有办法不访问注册表直接读出这个ID,哪位老大知道.请教啦
Pipi0714 2004-08-10
  • 打赏
  • 举报
回复
他是干什么的。
aspnetwuxueyou 2004-08-10
  • 打赏
  • 举报
回复
不知道,只知道通过注册表可以读出来
一、启用guest来宾帐户; 二、控制面板→管理工具→本地安全策略→本地策略→用户权利指派里,“从网络访问此计算机”中加入guest帐户,而“拒绝从网络访问这台计算机”中删除guest帐户; 三、我的电脑→工具→文件夹选项→查看→去掉“使用简单文件共享(推荐)”前的勾; 四、设置共享文件夹; 五、控制面板→管理工具→本地安全策略→本地策略→安全选项里,把“网络访问:本地帐户的共享和安全模式”设为“仅来宾-本地用户以来宾的身份验证”(可选,此项设置可去除访问时要求输入密码的对话框,也可视情况设为“经典-本地用户以自己的身份验证”); 六、右击“我的电脑”→“属性”→“计算机名”,该选项卡中有没有出现你的局域网工作组名称,如“work”等。然后单击“网络 ID”按钮,开始“网络标识向导”:单击“下一步”,选择“本机是商业网络的一部分,用它连接到其他工作着的计算机”;单击“下一步”,选择“公司使用没有域的网络”;单击“下一步”按钮,然后输入你的局域网的工作组名,如“work”,再次单击“下一步”按钮,最后单击“完成”按钮完成设置。 访问网上邻居时显示:" windows xp系统访问局域网时显示 "WORKGROUP无法访问.您可能没有权限使用网络资源.请与这台服务器的管理员联系以查明您是否有访问权限.此工作组的服务器的列表当前无法使用." 我用的是xp系统 我也遇到过这样的情况,当时也是着急得不轻,后来看到了以下的内容,照着一步步的做了做,真的好了。内容不少,但是仍然希望你能耐住性子,仔细的看看自己属于那种情况,应该会有所收获。 局域网互访 - [ 网络 ] 我也是类似问题。 以前一个局域网10多台机子互访问。安了蕃茄花园v2.3,感觉主题漂亮,桌面壁纸自动换,很爽。访问局域网计算机没问题。可网内其它机子在工作组内能看到我的机子,但打不开。说什么“没有权限”。所有设置都作了如下改动(网上找的),依然无效,何故?但求高手指点。 “网上邻居”无法互访问题解决方法大全 “网上邻居”无法互访的问题实在是太常见了,无论在学校,网吧还是家里多台电脑联机,都有可能遇到网上邻居无法互访的故展。“网上邻居”无法访问的故障多种多样,总结起来基本上有下面的几个: 1,没有共享资源/共享服务未启用。 症状:电脑与电脑间可以Ping通,但无法访问共享资源,在“计算机管理”中查看“本地共享”后会弹出“没有启动服务器服务”的错误对话框。 解决:在控制面板-管理工具-服务中启动Server服务。并设置“启动类型”为“自动”。 2,IP设置有误。 症状:双机之间无法互Ping,连接用的双绞线经过测试没有问题,没有安装防火墙。 解决:检查两台电脑的IP是否处在同一网段,还有子掩码是否相同。 3,WINXP默认设置不正确。 症状:从WIN98/2000/2003上无法访问另一台WINXP的机器。 解决:在“控制面板”中的“用户帐户”启用Guest帐号。然后在运行中输入secpol.msc启动“本地安全策略”。 本地策略 -> 用户权利指派,打开“从网络访问此计算机”,添加Guest帐户 本地策略 -> 安全选项,禁止"帐户:使用空白密码的本地帐户只允许进行控制台登陆"。 另外有时还会遇到另外一种情况:访问XP的时候,登录对话框中的用户名是灰的,始终是Guest用户,不能输入别的用户帐号。 解决:本地策略 -> 安全选项 -> "网络访问:本地帐户的共享和安全模式",修改为"经典-本地用户以自己的身份验证" 4,系统漏洞修补软件修改了安全策略。 症状:在“网上邻居”中可以看到对方的计算机,但是访问共享时却提示“没有权限访问网络” 解决:在开始菜单运行中输入secpol.msc启动“本地安全策略”,本地策略 -> 用户权利分配,打开“拒绝从网络访问这台计算机”,删除guest用户。 5,防火墙规则。 症状:安装了防火墙(包括WINXP系统自带的防火墙),出现无法Ping通,或者是访问共享资源的时候提示"XXX无法访问"、"您可能没有权限使用网络资源"、"请与这台服务器的管理员联系以查明您是否有访问权限"、"找不到网络路径"等类似的提示。 解决:停止防火墙或者添加局域网的访问规则。 WINXP自带的防火墙:打开控制面板 -> 网络和Internet连接 -> Windows防火墙 -> 例外,勾选“文件和打印机共享”。 6,Win2000/XP与Win98互访 症状:Ping命令可以通过,但无法在“网上邻居”中实现互访。 解决:在WIN2000/XP系统中:控制面板 -> 管理工具 -> 计算机管理 -> 本地用户和组 -> 用户,在Guest帐户上点击鼠标右键,选择属性,在常规项里取消

2,643

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧