Windows services 如何禁用特定驱动器

Windows services 如何禁用特定驱动器,windows-services,c#-2.0,Windows Services,C# 2.0,我需要使用c#windows服务禁用cdrom和usb大容量存储驱动程序。我注意到有一个帖子,但它不断弹出光盘托盘。除了使用此方法,是否有人知道如何禁用cd-rom。??在Vista及以上版本中,您可以使用设置禁用USB、cd-rom和其他类型的可移动存储。你甚至不需要服务。如果无法通过组策略基础结构执行此操作,则可以选择设置组策略控制的注册表项。本节中提到了注册表项的位置。请检查下面定义的VolumeManager。它具有锁定卷和禁用CD-ROM弹出的功能 公共类卷管理器 { 公共字符串驱动器

我需要使用c#windows服务禁用cdrom和usb大容量存储驱动程序。我注意到有一个帖子,但它不断弹出光盘托盘。除了使用此方法,是否有人知道如何禁用cd-rom。??

在Vista及以上版本中,您可以使用设置禁用USB、cd-rom和其他类型的可移动存储。你甚至不需要服务。如果无法通过组策略基础结构执行此操作,则可以选择设置组策略控制的注册表项。本节中提到了注册表项的位置。

请检查下面定义的VolumeManager。它具有锁定卷和禁用CD-ROM弹出的功能

公共类卷管理器
{
公共字符串驱动器号{private set;get;}
public IntPtr hFile{private set;get;}
公共卷管理器(字符串驱动器号)
{
Drivelette=Drivelette;
}
公共弹出状态弹出()
{
如果(!OpenHandle())
返回弹出状态。失败;
如果(锁定()&卸载())
{
if(防止删除(false)&&AutoEject())
{
CloseHandle();
返回EjectState.AutoEject;
}
其他的
{
CloseHandle();
返回EjectState.RemoveSafely;
}
}
其他的
{
CloseHandle();
返回EjectState.NoLock;
}
}
公共bool OpenHandle()
{
字符串文件名=“\\\.\\”+驱动器号+:”;
hFile=Win32.CreateFile(文件名,Win32.GENERIC_READ | Win32.GENERIC_WRITE,
Win32.FILE_SHARE_READ|Win32.FILE_SHARE_WRITE,IntPtr.Zero,Win32.OPEN_EXISTING,0,IntPtr.Zero);
if(hFile.ToInt32()==Win32.INVALID\u句柄)
{
返回false;
}
返回true;
}
公共void CloseHandle()
{
Win32.CloseHandle(hFile);
}
公共布尔锁()
{
uint字节返回=0;
int重试=0;
while(重试<20次)
{
如果(Win32.DeviceIoControl(hFile,Win32.FSCTL_LOCK__卷,IntPtr.Zero,0,IntPtr.Zero,0,
参考字节返回,整数为零)
{
返回true;
}
系统线程线程睡眠(250);
重试++;
}
返回false;
}
公共布尔下马()
{
uint字节返回=0;
如果(!Win32.DeviceIoControl(hFile,Win32.FSCTL_卸除_卷,IntPtr.Zero,0,IntPtr.Zero,0,
参考字节返回,整数为零)
{
返回false;
}
返回true;
}
公共防喷器移除(防喷器)
{
Win32.PREVENT_MEDIA_removation pmr=新的Win32.PREVENT_MEDIA_removation();
pmr.PreventMediaRemoving=预防;
IntPtr ptr=Marshal.AllocHGlobal(Marshal.SizeOf(pmr));
Marshal.StructureToPtr(pmr,ptr,true);
uint字节返回=0;
如果(!Win32.DeviceIoControl(hFile,Win32.IOCTL_存储_媒体_删除,ptr,封送处理大小(pmr),IntPtr.Zero,0,
参考字节返回,整数为零)
{
返回false;
}
返回true;
}
公共bool自动弹出()
{
uint字节返回=0;
如果(!Win32.DeviceIoControl(hFile,Win32.IOCTL_存储_弹出_介质,IntPtr.Zero,0,IntPtr.Zero,0,
参考字节返回,整数为零)
{
返回false;
}
返回true;
}
}
公共枚举弹出状态
{
失败,
诺沃卢姆,
诺洛克,
安全地,
自动弹出
}
公共类Win32
{
公共建筑文件\设备\文件\系统=0x00000009;
公共const-uint-IOCTL\u-STORAGE\u-BASE=0x0000002d;
公共警察文件任意访问=0;
公共构造文件读取权限=1;
公共consuint METHOD_BUFFERED=0;
公共设施FSCTL\u LOCK\u VOLUME=(文件设备文件系统我有一个解决方案

#region EjectMedia
        const uint GENERICREAD = 0x80000000;
        const uint OPENEXISTING = 3;
        const uint IOCTL_STORAGE_EJECT_MEDIA = 2967560;
        const int INVALID_HANDLE = -1;

        private static IntPtr fileHandle;
        private static uint returnedBytes;

        [DllImport("kernel32", SetLastError = true)]
        static extern IntPtr CreateFile(string fileName,
        uint desiredAccess,
        uint shareMode,
        IntPtr attributes,
        uint creationDisposition,
        uint flagsAndAttributes,
        IntPtr templateFile);
        [DllImport("kernel32", SetLastError = true)]
        static extern int CloseHandle(IntPtr driveHandle);
        [DllImport("kernel32", SetLastError = true)]
        static extern bool DeviceIoControl(IntPtr driveHandle,
        uint IoControlCode,
        IntPtr lpInBuffer,
        uint inBufferSize,
        IntPtr lpOutBuffer,
        uint outBufferSize,
        ref uint lpBytesReturned,
                 IntPtr lpOverlapped);
        #endregion

private void loop(object sender, EventArgs e)
{
 DriveInfo[] allDrives = DriveInfo.GetDrives();
            foreach (DriveInfo d in allDrives)
            {
                if (d.IsReady)
                {
                    if (d.DriveType == DriveType.Removable || d.DriveType == DriveType.Ram || d.DriveType == DriveType.Unknown) 
                        Eject(@"\\.\" + d.Name.Substring(0, 1) + ":");
                }
            }
}

 public void Eject(string driveLetter)
        {
            try
            {
                fileHandle = CreateFile(driveLetter, GENERICREAD, 0, IntPtr.Zero, OPENEXISTING, 0, IntPtr.Zero);
                if ((int)fileHandle != INVALID_HANDLE)
                    DeviceIoControl(fileHandle, IOCTL_STORAGE_EJECT_MEDIA, IntPtr.Zero, 0, IntPtr.Zero, 0, ref returnedBytes, IntPtr.Zero);
            }

            catch
            {
                EventLog.WriteEntry(Marshal.GetLastWin32Error().ToString());
            }

            finally
            {
                CloseHandle(fileHandle);
                fileHandle = IntPtr.Zero;
            }
        }