VC下獲取遠端主機共享資訊的一些方法

2021-05-22 00:20:31 字數 4634 閱讀 7202

vc

下獲取遠端主機共享資訊的一些方法

工程需要,要求就是在擁有了遠端主機的

ip位址、使用者名稱和密碼後列出遠端主機上所有的共享資源。綜合網上的資料和

msdn

wnet

、netapi

和wmi

這麼幾種方式,感覺

wmi是最強大的。下面就把各種方法大概說一下。

利用

wmi獲取遠端主機的共享資訊

1、

初始化操作

這部分我之前說過,參照以前

wmi連線遠端主機的文章

就可以了,必須要能夠正確得到

iwbemservices

物件,並為其設定了訪問許可權。

2、列舉遠端主機上的共享資源

共享資源對應的

wmi類名是win32_share,我們只要用

iwbemservices

物件的createinstanceenum()方法就可以得到所有的共享資源了。

hresult

hr = s_ok;

ienumwbemclassobject

* penumobj = null;

hr = piwbemservices->createinstanceenum(l

"win32_share", 0, null, &penumobj); hr

= cosetproxyblanket(

penumobj,

// indicates the proxy to set

rpc_c_authn_winnt,

// rpc_c_authn_***

rpc_c_authz_none,

// rpc_c_authz_***

null,

// server principal name

rpc_c_authn_level_call,

// rpc_c_authn_level_***

rpc_c_imp_level_impersonate, // rpc_c_imp_level_***

pcid,

// 這個需要設定使用者資訊,見之前

wmi連線遠端主機的文章

eoac_none

// proxy capabilities );

ulong

ureturned = 1;

while

(ureturned == 1)

} check_and_release

(penumadapters);

這裡需要注意下,我們得到了列舉物件後,如果不是操作本機,而是要得到遠端主機的共享資源是必須要為列舉物件設定訪問許可權的,也就是

cosetproxyblanket()

是不能少的。

3、得到共享資訊

這裡說下

getshareinfo()

方法的實現,我們通過列舉得到了每個共享物件

win32_share

的類的字元標識,這樣我們就可以使用

iwbemservices

物件的getobject()

方法得到具體的

win32_share

物件,其中

bstrpathname

就是之前得到的

pval.bstrval

。hresult

hr = -1;

safearray

*psanames

= null;

iwbemclassobject

* pclass = null;

long

llower, lupper;

piwbemservices

->getobject(bstrpathname, 0, null, &pclass, null); if

((hr = pclass->getnames(null, wbem_flag_always|wbem_flag_nonsystem_only, null, &psanames)) == s_ok)

if((hr = safearraygetubound(psanames, 1, &lupper)) != s_ok)

for (long

lcount=llower; lcount

<=lupper; lcount++)

else

if ((wcsicmp(propname,l

"name")==0) && varstring.vt!=vt_null)

else

if ((wcsicmp(propname,l

"path")==0) && varstring.vt!=vt_null)

} variantclear(&varstring);

if (propname != null)

if (bres)

} safearraydestroy(psanames); }

check_and_release

(pclass);

好了,到此

wmi就已經得到所有的共享資源了。

利用

wnet

獲取遠端主機的共享資訊

1、

連線遠端主機

netresource

nr;

memset

(&nr, 0, sizeof(nr)); nr

.dwscope=resource_connected;

nr.dwtype=resourcetype_disk; nr

.dwdisplaytype=resourcedisplaytype_generic;

nr.dwusage=resourceusage_connectable; nr

.lpremotename = (lptstr)lpremotename;//

遠端主機名或ip如

://192.168.1.11

wnetaddconnection2

(&nr, lppw/*

密碼*/

, lpuser/*

使用者名稱*/

, connect_update_profile); 2、

利用wnetopenenum

列舉共享資訊

dword

dwresult, dwresultenum;

handle

henum;

byte

buf[16384];

dword

cbbuffer = 16384;

// 16k is a good size

lpnetresource

lpnrlocal = (lpnetresource)buf;

dword

centries = -1;

dwresult

= wnetopenenum(resource_globalnet, // all network resources

resourcetype_disk,

//只列舉共享資料夾 0,

// enumerate all resources

&nr,

// null first time the function is called

&henum);

// handle to the resource

if(dwresult != no_error)

do }

else

if (dwresultenum != error_no_more_items)

} while

(dwresultenum != error_no_more_items);

wnetcloseenum

(henum);

wnet

方式列舉共享資源的時候好像無法的共享名以

$結尾的隱藏共享。

wnet

需要匯入的標頭檔案是:

winnetwk.h.

庫檔案是:

#pragma

comment(lib, "mpr.lib")

利用

netapi

獲取遠端主機的共享資訊

1、

連線遠端主機

這和wnet

方式完全一樣

2、列舉共享資源

pshare_info_1

bufptr, pinfo;

net_api_status

res;

dword

er=0,tr=0,resume=0, i; do

pinfo++; }

netapibufferfree(bufptr); }

}while

(res==error_more_data);

netapi

需要匯入的標頭檔案和庫檔案

#include

#pragma

comment(lib, "netapi32.lib")

PYTHON獲取遠端LINUX主機的一些資訊

root centos7s python cat linuxs.py usr bin python coding utf 8 from subprocess import popen,pipe import re import os,sys import paramiko reload sys sy...

vc 獲取軟體的版本資訊

我想大家在做軟體公升級的時候,經常想到要獲取當前軟體的版本與網路的中的乙個軟體版本進行判斷,是否需要對軟體進行更新公升級.我最近也在做,本來想到網上下一段獲取版本的 想不到找了許久,都找不到乙個能拷來就在mfc環境下面用的.也許是本人找東西的功力還非常有限,我願意把自己拼湊好的 貼出來,讓和我一樣,...

DOS命令下獲取遠端主機MAC位址的三種方法

第一種方法 使用arp命令 這個命令很多的網路或者是系統管理員應該不會對它陌生了 它的使用方法非常的簡單。要想使用arp命令獲取遠端主機的mac位址,管理員只要用 ping命令ping一下遠端主機的ip位址,然後用arp a 或者是 arp g 就得到乙個ip位址 和mac位址的對應表,這樣,系統管...