C#如何将CDROM的驱动器号从D:更改为Z:

我正在尝试编写一个将CDROM驱动器从字母D更改为字母Z并且与WMI没有任何运气的方法。 有没有其他方法可以使用C#做到这一点?

public void setVolCDROM() { SelectQuery queryCDROM = new SelectQuery("SELECT * FROM Win32_cdromdrive"); ManagementObjectSearcher searcherCDROM = new ManagementObjectSearcher(queryCDROM); foreach(ManagementObject cdromLetter in searcherCDROM.Get()) { MessageBox.Show(cdromLetter["Drive"].ToString() + "\n" + cdromLetter["Manufacturer"].ToString()); if (cdromLetter["Drive"].ToString() == "D:") { cdromLetter["Drive"] = "Z:"; cdromLetter.Put(); } } } 

我不知道WMI,但您可以使用winapi更改驱动器号,这是我将一个示例移植到C#(只需要您需要的部分)

 [DllImport("kernel32.dll", SetLastError = true)] static extern bool GetVolumeNameForVolumeMountPoint(string lpszVolumeMountPoint, [Out] StringBuilder lpszVolumeName, uint cchBufferLength); [DllImport("kernel32.dll")] static extern bool DeleteVolumeMountPoint(string lpszVolumeMountPoint); [DllImport("kernel32.dll")] static extern bool SetVolumeMountPoint(string lpszVolumeMountPoint, string lpszVolumeName); const int MAX_PATH = 260; private void ChangeDriveLetter() { StringBuilder volume = new StringBuilder(MAX_PATH); if (!GetVolumeNameForVolumeMountPoint(@"D:\", volume, (uint)MAX_PATH)) Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error()); if (!DeleteVolumeMountPoint(@"D:\")) Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error()); if (!SetVolumeMountPoint(@"Z:\", volume.ToString())) Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error()); } 

小心运行此代码,您必须先删除驱动器安装点,然后再将其分配给新的字母,这可能会导致问题,原始代码:

 /***************************************************************** WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING This program will change drive letter assignments, and the changes persist through reboots. Do not remove drive letters of your hard disks if you do not have this program on floppy disk or you might not be able to access your hard disks again! *****************************************************************/ 

杰森,你可以使用Win32_Volume

试试这段代码

  ManagementObjectSearcher disks = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_Volume WHERE DriveLetter = 'D:'"); foreach (ManagementObject disk in disks.Get()) { disk.Get(); disk["DriveLetter"] = "Z:"; disk.Put(); } 

谢谢罗德里戈! 这正是我想要的。 我刚刚添加了一些wmi代码,以便我可以确保我抓住了CDROM驱动器。

 public void setCDROM(){ SelectQuery queryCDROM = new SelectQuery("SELECT * FROM Win32_cdromdrive"); ManagementObjectSearcher searcherCDROM = new ManagementObjectSearcher(queryCDROM); int i = 0; foreach(ManagementObject cdromLetter in searcherCDROM.Get()) { // if stement in place to handle if there is more than one cdrom drive // this will only handle the first cdrom drive encountered i = i + 1; if (i == 1) { // run the ChangeDriveLetter method passing the drive letter string ChangeDriveLetter(cdromLetter["Drive"].ToString()); } } } 

我认为WMI的SelectQueries应该只读取/查询信息而不执行任何更新。 我可能是错的,但我想更改驱动器号,你应该在一些Win32 Api中降低…

请参阅IOCTL_MOUNTMGR_CREATE_POINT 。

祝好运。

我想在rodrigoq的解决方案中添加一个注释,在Vista及以上版本中,您需要使用提升的权限运行您的应用程序,否则您将无法删除挂载点并为其分配新的驱动器号,这将导致被抛出的exception。