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

jas*_*son 8 .net c# wmi visual-studio

我正在尝试编写一个将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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

rod*_*goq 8

我不知道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());
}
Run Code Online (Sandbox Code Playgroud)

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

/*****************************************************************
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!
*****************************************************************/
Run Code Online (Sandbox Code Playgroud)

  • 我还在警告通知中找到了对"软盘"的引用. (6认同)

RRU*_*RUZ 5

杰森,你可以使用这个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();
    }
Run Code Online (Sandbox Code Playgroud)


Dav*_*ras 0

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