我正在尝试编写一种方法,将CD ROM驱动器从字母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();
}
}
}
答案 0 :(得分:8)
我不知道WMI,但您可以使用winapi更改驱动器号,这是我将example移植到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 :(得分:1)
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();
}
答案 2 :(得分:1)
谢谢罗德里戈!这正是我想要的。我刚刚添加了一些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());
}
}
}
答案 3 :(得分:0)
我认为WMI的SelectQueries应该只读取/查询信息而不执行任何更新。我可能错了,但我想更改一些Win32 Api中应该降低的驱动器号...
答案 4 :(得分:0)
答案 5 :(得分:0)
我想在rodrigoq的解决方案中添加一个注释,在Vista及以上版本中,您需要使用提升的权限运行您的应用程序,否则您将无法删除挂载点并为其分配一个新的驱动器号会引发异常。