除了枚举注册表,有没有获取 “NT服务描述” 的函数 或 其他方法呀?

HoneyPot 2005-07-21 04:55:13

今天学习NT服务程序,发现服务和注册表有牵连,但是

除了枚举注册表,有没有获取 “NT服务描述” 的函数 或 大家有没有其他的好方法方法呀?
...全文
105 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
HoneyPot 2005-07-21
  • 打赏
  • 举报
回复
感谢二位,wmi我想就不用了,每次调用很费资源(其实wmi不是那么简单的,但很强大)
idAnts 2005-07-21
  • 打赏
  • 举报
回复
还没完,
LPSERVICE_DESCRIPTION pConfig2 = (SERVICE_DESCRIPTION *)szKeyName;
pConfig2->lpDescription//这个就是描述。
idAnts 2005-07-21
  • 打赏
  • 举报
回复
就描述啊?那容易。
szKeyName是个buffer,ddddd是长度。

QueryServiceConfig2(scService,SERVICE_CONFIG_DESCRIPTION,szKeyName,ddddd,&ddddd)
masterz 2005-07-21
  • 打赏
  • 举报
回复
use Win32_Service in order to enumerate service. It should be able to print description of service
masterz 2005-07-21
  • 打赏
  • 举报
回复
WMI can enum service
the following sample enumerate all CD Drives, it is very simple to modify it to enumerate services
http://fruitfruit.blogspot.com/2005/07/wmi-enum-all-cddrive-and-dump.html
wmi enum all cddrive and dump properties

//The following can run on windows 2000 professional when login as

guest

#define _WIN32_DCOM

#include <Wbemidl.h>

#pragma comment(lib,"Wbemuuid.lib")

#include <atlbase.h>

#include "objbase.h"

#include <windows.h>

#include <comutil.h>

#pragma comment(lib, "comsupp.lib")

#include <iostream>



void print_property(CComBSTR bstrPropName, _variant_t& varProperty)

{

std::cout<<" "<<(LPCTSTR)_bstr_t(bstrPropName);

std::cout<<" = ";



if(varProperty.vt !=VT_EMPTY && VT_NULL != varProperty.vt)

{

_variant_t vDest;

HRESULT hr = VariantChangeType(&vDest, &varProperty,0,VT_BSTR);

if(SUCCEEDED(hr))

std::cout<< (LPCTSTR)_bstr_t(varProperty);

else

{

if(varProperty.vt == (VT_ARRAY | VT_I4) )

{

SAFEARRAY* psa = varProperty.parray;

int *pIntArray = NULL;

SafeArrayAccessData(psa,(VOID**)&pIntArray);

UINT uDim = SafeArrayGetDim(psa);

if(1==uDim)

{

long lLbound,lRbound;

SafeArrayGetLBound(psa,1,&lLbound);

SafeArrayGetUBound(psa,1,&lRbound);

for(long i=lLbound;i<=lRbound;i++)

{

std::cout<< pIntArray[i]<<" ";

}

}

SafeArrayUnaccessData(psa);

}

else

{

std::cout<< varProperty.vt << " type ";

}

}

}

else

{

if(varProperty.vt == VT_EMPTY)

std::cout<< "VT_EMPTY ";

else

std::cout<< "VT_NULL";

}

std::cout<<std::endl;

}



HRESULT PrintObject(IWbemClassObject* spInstance)

{

// std::cout<<__FUNCTION__<<" start "<<std::endl;

LPSAFEARRAY psa = NULL;

HRESULT hres;

hres = spInstance->GetNames( NULL,

WBEM_FLAG_ALWAYS | WBEM_FLAG_NONSYSTEM_ONLY,

NULL,

&psa);

long lLower, lUpper;

SafeArrayGetLBound(psa , 1, &lLower);

SafeArrayGetUBound(psa , 1, &lUpper);

for (long i = lLower; i <= lUpper; ++i)

{

CComBSTR bstrPropName;

if (S_OK != (hres = SafeArrayGetElement(psa, &i, &bstrPropName)) )

{

if (NULL != psa)

SafeArrayDestroy(psa);

return hres;

}

_variant_t varProperty;

HRESULT hr = spInstance->Get(bstrPropName,0,&varProperty,NULL,0);

print_property(bstrPropName,varProperty);

}

if (NULL != psa)

SafeArrayDestroy(psa);

// std::cout<<__FUNCTION__<<" end "<<std::endl;

return S_OK;

}

main()

{

CoInitialize(NULL);

{

HRESULT hr = S_OK;

CComPtr<IWbemLocator> spLoc;

hr = spLoc.CoCreateInstance(CLSID_WbemLocator);

CComBSTR bstrNamespace("\\\\.\\root\\CIMV2");

CComPtr<IWbemServices> spServices;

hr = spLoc->ConnectServer(bstrNamespace, NULL, NULL, 0,

NULL, 0, 0, &spServices);

hr = CoSetProxyBlanket(spServices, RPC_C_AUTHN_DEFAULT,

RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL,

RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE);

{

CComPtr<IEnumWbemClassObject> spEnumInst;

hr = spServices->CreateInstanceEnum(CComBSTR("Win32_CDROMDrive"),

WBEM_FLAG_SHALLOW, NULL, &spEnumInst);

bool bFinished = false;

while (!bFinished)

{

ULONG uNumOfInstances = 0;

CComPtr<IWbemClassObject> spInstance;

HRESULT hrNext = spEnumInst->Next(10000, 1, &spInstance,

&uNumOfInstances);

if (hrNext == WBEM_S_FALSE)

bFinished = true;

else if (hrNext == WBEM_S_NO_ERROR)

{

CComBSTR bstrPropName = "Drive";

_variant_t varProperty;

hr = spInstance->Get(bstrPropName,0,&varProperty,NULL,0);

print_property(bstrPropName,varProperty);

if(SUCCEEDED(hr) && VT_BSTR == varProperty.vt)

{

_bstr_t bsdrive = varProperty;

bstrPropName = "Caption";

hr = spInstance->Get(bstrPropName,0,&varProperty,NULL,0);

if(SUCCEEDED(hr) && VT_BSTR == varProperty.vt)

{



}

print_property(bstrPropName,varProperty);



}

}

}

}

}



std::cout<< "finished "<<std::endl;

CoUninitialize();

}

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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