C # Как изменить букву диска CDROM с D: на Z: - PullRequest
7 голосов
/ 23 февраля 2011

Я пытаюсь написать метод, который изменит привод 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();
        }
    }
}

Ответы [ 6 ]

8 голосов
/ 23 февраля 2011

Я не знаю о 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!
*****************************************************************/
1 голос
/ 23 февраля 2011

Спасибо, Родриго! Это было именно то, что я искал. Я просто добавил некоторый 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());
                    }
                }
}
1 голос
/ 23 февраля 2011

Джейсон, вы можете использовать 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();
    }
0 голосов
/ 05 января 2014

Я просто хотел бы добавить примечание к решению Rodrigoq о том, что в Vista и более поздних версиях вам нужно будет запускать ваше приложение с повышенными привилегиями, иначе вы не сможете удалить точку монтирования и назначить ей новую букву диска, которая вызовет исключение.

0 голосов
/ 23 февраля 2011

См. IOCTL_MOUNTMGR_CREATE_POINT .

Удачи.

0 голосов
/ 23 февраля 2011

Я думаю, что SelectQueries WMI должны только читать / запрашивать информацию, а не выполнять какие-либо обновления.Я могу ошибаться, но я думаю, чтобы изменить букву диска, вы должны пойти ниже в некоторых Win32 Api ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...