| 发表于:2007-08-31 18:05:29 楼主 |
我用c#写了一个读取客户端mac地址的控件,在winform下运行正常,搬到ie里就出现权限错误: 请求“system.security.permissions.registrypermission, mscorlib, version=2.0.0.0, culture=neutral, publickeytoken=b77a5c561934e089”类型的权限已失败。 窗体上只有一个文本框,用来显示mac地址,源代码如下: using system; using system.net; using system.collections.generic; using system.componentmodel; using system.drawing; using system.data; using system.text; using system.windows.forms; using system.runtime.interopservices; using microsoft.win32; using system.management; using system.diagnostics; using system.text.regularexpressions; namespace wmactivex { [guid( "d3722706-9591-4449-b8aa-f35ee65fb9b0 ")] public partial class hardware : usercontrol { public hardware() { initializecomponent(); textbox1.text = getlocalmac(); } public static string getlocalmac() { list <string> netcardlist = getnetcardlist(); list <string> .enumerator enumnetcard = netcardlist.getenumerator(); string macaddr = string.empty; while (enumnetcard.movenext()) { macaddr = getphysicaladdr(enumnetcard.current); if (macaddr != string.empty) { break; } } return macaddr; } public static list <string> getnetcardlist() { list <string> cardlist = new list <string> (); try { //请求“system.security.permissions.registrypermission, mscorlib, version=2.0.0.0, culture=neutral, publickeytoken=b77a5c561934e089”类型的权限已失败。 registrykey regnetcards = registry.localmachine.opensubkey(win32utils.reg_net_cards_key); if (regnetcards != null) { string[] names = regnetcards.getsubkeynames(); registrykey subkey = null; foreach (string name in names) { subkey = regnetcards.opensubkey(name); if (subkey != null) { object o = subkey.getvalue( "servicename "); if (o != null) { cardlist.add(o.tostring()); } } } } } catch (exception ex) { } return cardlist; } private static string getphysicaladdr(string cardid) { string macaddress = string.empty; uint device = 0; try { string drivename = "\\\\.\\ " + cardid; device = win32utils.createfile(drivename, win32utils.generic_read ¦ win32utils.generic_write, win32utils.file_share_read ¦ win32utils.file_share_write, 0, win32utils.open_existing, 0, 0); if (device != win32utils.invalid_handle_value) { byte[] outbuff = new byte[6]; uint bytrv = 0; int intbuff = win32utils.permanent_address; if (0 != win32utils.deviceiocontrol(device, win32utils.ioctl_ndis_query_global_stats, ref intbuff, 4, outbuff, 6, ref bytrv, 0)) { string temp = string.empty; foreach (byte b in outbuff) { temp = convert.tostring(b, 16).padleft(2, '0 '); macaddress += temp; temp = string.empty; } } } } finally { if (device != 0) { win32utils.closehandle(device); } } return macaddress; } } #region win32utils public class win32utils { public const string reg_net_cards_key = @ "software\microsoft\windows nt\currentversion\networkcards "; public const uint generic_read = 0x80000000; public const uint generic_write = 0x40000000; public const uint file_share_read = 0x00000001; public const uint file_share_write = 0x00000002; public const uint open_existing = 3; public const uint invalid_handle_value = 0xffffffff; public const uint ioctl_ndis_query_global_stats = 0x00170002; public const int permanent_address = 0x01010101; [dllimport( "kernel32.dll ")] public static extern int closehandle(uint hobject); [dllimport( "kernel32.dll ")] public static extern int deviceiocontrol(uint hdevice, uint dwiocontrolcode, ref int lpinbuffer, int ninbuffersize, byte[] lpoutbuffer, int noutbuffersize, ref uint lpbytesreturned, int lpoverlapped); [dllimport( "kernel32.dll ")] public static extern uint createfile(string lpfilename, uint dwdesiredaccess, uint dwsharemode, int lpsecurityattributes, uint dwcreationdisposition, uint dwflagsandattributes, int htemplatefile); } #endregion } |
|
|
|
|