前幾天在開發(fā)中弄了一個(gè)產(chǎn)品注冊(cè)機(jī)制,然后要獲取硬件的相關(guān)參數(shù),比如:網(wǎng)卡MAC地址,CPUID等,當(dāng)程序?qū)懲炅?,在本地調(diào)式一點(diǎn)問題也沒有,但是傳到服務(wù)器上問題就來了,程序錯(cuò)誤:
System.Management.ManagementException: 訪問遭到拒絕 在 System.Management.ManagementException.ThrowWithExtendedInfo(ManagementStatus errorCode) 在 System.Management.ManagementScope.InitializeGuts(Object o) 在 System.Management.ManagementScope.Initialize() 在 System.Management.ManagementObject.Initialize(Boolean getObject) 在 System.Management.ManagementClass.GetInstances(EnumerationOptions options) 在 System.Management.ManagementClass.GetInstances() 在 ManagementTest.Class1.GetCpuId()
從信息中得知,是下面代碼處出了問題:
ManagementClass mc = new ManagementClass("Win32_Processor");
ManagementObjectCollection moc = mc.GetInstances();
foreach (ManagementObject mo in moc)
{
CPUID= mo.Properties["ProcessorId"].Value.ToString();
break;
}
貌似是運(yùn)行。net的權(quán)限不足。導(dǎo)致asp.net進(jìn)程無法訪問System.Management類。(其實(shí)不是的,先鄙視一下亂下結(jié)論的人,呵呵?。?br />郁悶中在百度上百度了一下,找到一條消息(http://wiki.supesoft.com/(X(1)S(4ukvvj3nsjwvlninzlvozl3z))/Default.aspx?Page=FrameWork-ManagementException&NoRedirect=1&AspxAutoDetectCookieSupport=1):從上面看來是否是沒有錯(cuò)誤處理,但是往下一看,并非如此,他把CPUID換成程序跟目錄了。貌似也是唯一的,暫時(shí)可用。
后來問題有來了,輸入的注冊(cè)嗎怎么也不對(duì),經(jīng)過研究得知并非是asp.net進(jìn)程權(quán)限不足問題。
解決方案:
原理:頁面(與IIS有關(guān))運(yùn)行的權(quán)限低于DLL運(yùn)行的權(quán)限,估計(jì)是微軟考慮到什么黑客會(huì)利用此漏洞而設(shè)計(jì)的。只要在運(yùn)行頁面前把這個(gè)值獲取就沒問題。
結(jié)果整理了一下,完整代碼如下:
/// <summary>
/// 獲取CPUID
/// </summary>
/// <returns></returns>
public static string GetCpuId()
{
string cpuId = null;
ManagementClass mClass = new ManagementClass("Win32_Processor");
try
{
ManagementObjectCollection moc = mClass.GetInstances();
foreach (ManagementObject mo in moc)
{
cpuId = mo.Properties["ProcessorId"].Value.ToString();
break;
}
}
catch (Exception ex)
{
cpuId =ex.ToString();
}
if (System.Web.HttpContext.Current.Application["CPUID"] == null)
{
System.Web.HttpContext.Current.Application.Lock();
System.Web.HttpContext.Current.Application["CPUID"] = cpuId;
System.Web.HttpContext.Current.Application.UnLock();
}
return cpuId;
}
在頁面調(diào)用CPUID值: System.Web.HttpContext.Current.Application["CPUID"].ToString();
運(yùn)行的前提是必須把這個(gè)代碼在頁面執(zhí)行前運(yùn)行,如加在 httpModules 里程序一開始就先執(zhí)行這個(gè)代碼。
最后貼上運(yùn)行效果:
--------------頁面調(diào)用前開始--------------
CPUID值:BFEBFBFF00000F29
--------------頁面調(diào)用前結(jié)束--------------
--------------頁面調(diào)
用開始--------------
CPUID值:System.Management.ManagementException: 訪問遭到拒絕 在 System.Management.ManagementException.ThrowWithExtendedInfo(ManagementStatus errorCode) 在 System.Management.ManagementScope.InitializeGuts(Object o) 在 System.Management.ManagementScope.Initialize() 在 System.Management.ManagementObject.Initialize(Boolean getObject) 在 System.Management.ManagementClass.GetInstances(EnumerationOptions options) 在 System.Management.ManagementClass.GetInstances() 在 ManagementTest.Class1.GetCpuId()
--------------頁面調(diào)用結(jié)束--------------
下面是測(cè)試的例子,碰到此問題的朋友可以下載去測(cè)試一下就明白了。
點(diǎn)擊下載
如對(duì)本文有疑問,請(qǐng)?zhí)峤坏浇涣髡搲?,廣大熱心網(wǎng)友會(huì)為你解答??! 點(diǎn)擊進(jìn)入論壇