http://expert.csdn.net/Expert/topic/1465/1465630.xml?temp=.3021051http://expert.csdn.net/Expert/topic/1415/1415484.xml?temp=.3598139

解决方案 »

  1.   

    我想知道这段代码在aspx里面为什么不能用呢?
      

  2.   

    因为在web方式下权限不够,用别的方法吧
      

  3.   

    我是把这段代码封装在一个dll里面,再在ASPX里面调用的,权限也不够么?但是,我能取出硬盘的Volumn啊
      

  4.   

    我是转载的偶头的:)
    原作者:痕迹
    欢迎来这里看看www.uncj.net
    C#读硬盘序列号的原代码public class IDE 

    [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)] 
    internal struct IDSECTOR 

    public ushort wGenConfig; 
    public ushort wNumCyls; 
    public ushort wReserved; 
    public ushort wNumHeads; 
    public ushort wBytesPerTrack; 
    public ushort wBytesPerSector; 
    public ushort wSectorsPerTrack; 
    [ MarshalAs( UnmanagedType.ByValArray, SizeConst=3)] 
    public ushort [] wVendorUnique; 
    [ MarshalAs( UnmanagedType.ByValTStr, SizeConst=20)] 
    public string sSerialNumber; 
    public ushort wBufferType; 
    public ushort wBufferSize; 
    public ushort wECCSize; 
    [ MarshalAs( UnmanagedType.ByValTStr, SizeConst=8)] 
    public string sFirmwareRev; 
    [ MarshalAs( UnmanagedType.ByValTStr, SizeConst=40)] 
    public string sModelNumber; 
    public ushort wMoreVendorUnique; 
    public ushort wDoubleWordIO; 
    public ushort wCapabilities; 
    public ushort wReserved1; 
    public ushort wPIOTiming; 
    public ushort wDMATiming; 
    public ushort wBS; 
    public ushort wNumCurrentCyls; 
    public ushort wNumCurrentHeads; 
    public ushort wNumCurrentSectorsPerTrack; 
    public uint ulCurrentSectorCapacity; 
    public ushort wMultSectorStuff; 
    public uint ulTotalAddressableSectors; 
    public ushort wSingleWordDMA; 
    public ushort wMultiWordDMA; 
    [ MarshalAs( UnmanagedType.ByValArray, SizeConst=128 )] 
    public byte [] bReserved; 
    } [StructLayout(LayoutKind.Sequential)] 
    internal struct DRIVERSTATUS 

    public byte bDriverError; 
    public byte bIDEStatus; 
    [ MarshalAs( UnmanagedType.ByValArray, SizeConst=2 )] 
    public byte [] bReserved; 
    [ MarshalAs( UnmanagedType.ByValArray, SizeConst=2 )] 
    public uint [] dwReserved; 
    } [StructLayout(LayoutKind.Sequential)] 
    internal struct SENDCMDOUTPARAMS 

    public uint cBufferSize; 
    public DRIVERSTATUS DriverStatus; 
    [ MarshalAs( UnmanagedType.ByValArray, SizeConst=513 )] 
    public byte [] bBuffer; 
    } [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)] 
    internal struct SRB_IO_CONTROL 

    public uint HeaderLength; 
    [ MarshalAs( UnmanagedType.ByValTStr, SizeConst=8 )] 
    public string Signature; 
    public uint Timeout; 
    public uint ControlCode; 
    public uint ReturnCode; 
    public uint Length; 
    } [StructLayout(LayoutKind.Sequential)] 
    internal struct IDEREGS 

    public byte bFeaturesReg; 
    public byte bSectorCountReg; 
    public byte bSectorNumberReg; 
    public byte bCylLowReg; 
    public byte bCylHighReg; 
    public byte bDriveHeadReg; 
    public byte bCommandReg; 
    public byte bReserved; 
    } [StructLayout(LayoutKind.Sequential)] 
    internal struct SENDCMDINPARAMS 

    public uint cBufferSize; 
    public IDEREGS irDriveRegs; 
    public byte bDriveNumber; 
    [ MarshalAs( UnmanagedType.ByValArray, SizeConst=3 )] 
    public byte [] bReserved; 
    [ MarshalAs( UnmanagedType.ByValArray, SizeConst=4 )] 
    public uint [] dwReserved; 
    public byte bBuffer; 
    } [StructLayout(LayoutKind.Sequential)] 
    internal struct GETVERSIONOUTPARAMS 

    public byte bVersion; 
    public byte bRevision; 
    public byte bReserved; 
    public byte bIDEDeviceMap; 
    public uint fCapabilities; 
    [ MarshalAs( UnmanagedType.ByValArray, SizeConst=4 )] 
    public uint [] dwReserved; // For future use. 
    } [DllImport("kernel32.dll")] 
    private static extern int CloseHandle(uint hObject); [DllImport("kernel32.dll")] 
    private static extern int DeviceIoControl(uint hDevice, 
    uint dwIoControlCode, 
    ref SENDCMDINPARAMS lpInBuffer, 
    int nInBufferSize, 
    ref SENDCMDOUTPARAMS lpOutBuffer, 
    int nOutBufferSize, 
    ref uint lpbytesReturned, 
    int lpOverlapped); [DllImport("kernel32.dll")] 
    private static extern int DeviceIoControl(uint hDevice, 
    uint dwIoControlCode, 
    int lpInBuffer, 
    int nInBufferSize, 
    ref GETVERSIONOUTPARAMS lpOutBuffer, 
    int nOutBufferSize, 
    ref uint lpbytesReturned, 
    int lpOverlapped); [DllImport("kernel32.dll")] 
    private static extern uint CreateFile(string lpFileName, 
    uint dwDesiredAccess, 
    uint dwShareMode, 
    int lpSecurityAttributes, 
    uint dwCreationDisposition, 
    uint dwFlagsAndAttributes, 
    int hTemplateFile); private const uint GENERIC_READ = 0x80000000; 
    private const uint GENERIC_WRITE = 0x40000000; 
    private const uint FILE_SHARE_READ = 0x00000001; 
    private const uint FILE_SHARE_WRITE = 0x00000002; 
    private const uint OPEN_EXISTING = 3; 
    private const uint INVALID_HANDLE_VALUE = 0xffffffff; 
    private const uint DFP_GET_VERSION = 0x00074080; 
    private const int IDE_ATAPI_IDENTIFY = 0xA1; // Returns ID sector for ATAPI. 
    private const int IDE_ATA_IDENTIFY = 0xEC; // Returns ID sector for ATA. 
    private const int IDENTIFY_BUFFER_SIZE = 512; 
    private const uint DFP_RECEIVE_DRIVE_DATA = 0x0007c088; public static string Read(byte drive) 

    OperatingSystem os = Environment.OSVersion; 
    if (os.Platform != PlatformID.Win32NT) throw new NotSupportedException("仅支持WindowsNT/2000/XP"); 
    //我没有NT4,请哪位大大测试一下NT4下能不能用 
    //if (os.Version.Major < 5) throw new NotSupportedException("仅支持WindowsNT/2000/XP"); string driveName = "\\\\.\\PhysicalDrive" + drive.ToString(); 
    uint device = CreateFile(driveName, 
    GENERIC_READ | GENERIC_WRITE, 
    FILE_SHARE_READ | FILE_SHARE_WRITE, 
    0, OPEN_EXISTING, 0, 0); 
    if (device == INVALID_HANDLE_VALUE) return ""; 
    GETVERSIONOUTPARAMS verPara = new GETVERSIONOUTPARAMS(); 
    uint bytRv = 0; if (0 != DeviceIoControl(device, DFP_GET_VERSION, 
    0, 0, ref verPara, Marshal.SizeOf(verPara), 
    ref bytRv, 0)) 

    if (verPara.bIDEDeviceMap > 0) 

    byte bIDCmd = (byte)(((verPara.bIDEDeviceMap >> drive & 0x10) != 0) ? IDE_ATAPI_IDENTIFY : IDE_ATA_IDENTIFY); 
    SENDCMDINPARAMS scip = new SENDCMDINPARAMS(); 
    SENDCMDOUTPARAMS scop = new SENDCMDOUTPARAMS(); scip.cBufferSize = IDENTIFY_BUFFER_SIZE; 
    scip.irDriveRegs.bFeaturesReg = 0; 
    scip.irDriveRegs.bSectorCountReg = 1; 
    scip.irDriveRegs.bCylLowReg = 0; 
    scip.irDriveRegs.bCylHighReg = 0; 
    scip.irDriveRegs.bDriveHeadReg = (byte)(0xA0 | ((drive & 1) << 4)); 
    scip.irDriveRegs.bCommandReg = bIDCmd; 
    scip.bDriveNumber = drive; if (0 != DeviceIoControl(device, DFP_RECEIVE_DRIVE_DATA, 
    ref scip, Marshal.SizeOf(scip), ref scop, 
    Marshal.SizeOf(scop), ref bytRv, 0)) 

    StringBuilder s = new StringBuilder(); 
    for (int i = 20; i < 40; i += 2) 

    s.Append((char)(scop.bBuffer[i+1])); 
    s.Append((char)scop.bBuffer[i]); 

    CloseHandle(device); 
    return s.ToString().Trim(); 



    CloseHandle(device); 
    return ""; 


      

  5.   

    using System.Management;ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
       ManagementObjectCollection moc = mc.GetInstances();
       foreach(ManagementObject mo in moc)
       {
        if((bool)mo["IPEnabled"] == true)
         Response.Write("MAC address\t\r"+ mo["MacAddress"].ToString()+"
    ");
       }
       ManagementObject disk = new ManagementObject("win32_logicaldisk.deviceid=\"c:\"");
       disk.Get();   Response.Write("Volume Serial Number: " + disk.GetPropertyvalue("VolumeSerialNumber").ToString());参考文章:
    http://www.lionsky.net/club/dispbbs.asp?boardID=3&ID=1173注:如果是用vs.net编译要添加对System.Management.dll的引用
      

  6.   

    如果你要的是分区卷标是可以用GetVolumeInformation,要求只要有list 权限,而硬件访问不能是guest 组。封装在dll 也是一样是asp.net 权限,不可能是admin或者system 如果封装后可以提升权限,那么主机空间提供商就死QQ了。。
      

  7.   

    那我如何可以用ASPX取出硬盘序列号?