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位址的對應表,這樣,系統管...