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