USB存储设备的5种打开方式以及其关系

1. USB存储设备的标识

USB存储设备插入电脑之后,系统会给设备分配物理驱动器号、设备路径、卷路径。

1.1. 物理驱动器号

StringMeaning
\\.\PhysicalDrive0Opens the first physical drive.
\\.\PhysicalDrive1Opens the third physical drive.

1.2. 设备路径

DevicePath:
\\.\usbstor#disk&ven_usb&prod_flash_drive&rev_1.00#6&31e44d9c&3#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}

1.3. 卷路径

卷又被称为逻辑驱动器。

VolumePath:
\\.\Volume{65f4b646-a379-11e9-a35f-005056c00008}

1.3.1 卷设备名

一个卷都对应一个卷设备名。

VolumeName:
\\.\HarddiskVolume57

1.3.2 逻辑驱动器号

逻辑驱动器号它是操作系统方便用户直接访问卷而建立的一个映射。
即给卷分配挂载点(Mount Point),可以通过SetVolumeMountPoint来实现。挂载点有两种形式,一种是直接分配逻辑盘符(Logic disk letter),另一种是卷文件夹(Mounted folder)。如C盘空间不够,电脑插入一个新的硬盘,我们可以直接将这个硬盘挂载到C盘下作为C盘的一个文件夹。

Logic Disk Letter:
H:\

2. 设备标识之间的关系

2.1. 通过逻辑盘符获取物理设备号

DWORD GetPhysicalDriveFromDiskLetter(char letter)
{
    CHAR path[DISK_PATH_LEN] = {0};
    sprintf(path, "\\\\.\\%c:", letter);
 	HANDLE  hDevice = CreateFile(path,                // drive to open
                         GENERIC_READ | GENERIC_WRITE,    // access to the drive
                         FILE_SHARE_READ | FILE_SHARE_WRITE,    //share mode
                         NULL,             // default security attributes
                         OPEN_EXISTING,    // disposition
                         0,                // file attributes
                         NULL);            // do not copy file attribute
    if (hDevice == INVALID_HANDLE_VALUE) // cannot open the drive
    {
        fprintf(stderr, "CreateFile() Error: %ld\n", GetLastError());
        return DWORD(-1);
    }
 
    DWORD readed = 0;                   // discard results
    STORAGE_DEVICE_NUMBER ;             //use this to get disk numbers
    BOOL result = DeviceIoControl(
                hDevice,                // handle to device
                IOCTL_STORAGE_GET_DEVICE_NUMBER, // dwIoControlCode
                NULL,                            // lpInBuffer
                0,                               // nInBufferSize
                &number,           // output buffer
                sizeof(number),         // size of output buffer
                &readed,       // number of bytes returned
                NULL      // OVERLAPPED structure
            );
    if (!result) // fail
    {
        fprintf(stderr, "IOCTL_STORAGE_GET_DEVICE_NUMBER Error: %ld\n", GetLastError());
        (void)CloseHandle(hDevice);
        return (DWORD)-1;
    }
    //printf("%d %d %d\n\n", number.DeviceType, number.DeviceNumber, number.PartitionNumber);
 
    (void)CloseHandle(hDevice);
    return number.DeviceNumber;
}

2.2. 通过卷名获取物理设备号

DWORD GetPhysicalDriveFromVolumeName(LPCSTR lpcVolumeName)
{
    CHAR path[DISK_PATH_LEN] = {0};
    sprintf(path, "\\\\.\\%s", lpcVolumeName);
    // 如:"\\.\Volume{f0a05445-2d33-11e6-9b0b-806e6f6e6963}"
 	HANDLE  hDevice = CreateFile(path,                // drive to open
                         GENERIC_READ | GENERIC_WRITE,    // access to the drive
                         FILE_SHARE_READ | FILE_SHARE_WRITE,    //share mode
                         NULL,             // default security attributes
                         OPEN_EXISTING,    // disposition
                         0,                // file attributes
                         NULL);            // do not copy file attribute
    if (hDevice == INVALID_HANDLE_VALUE) // cannot open the drive
    {
        fprintf(stderr, "CreateFile() Error: %ld\n", GetLastError());
        return DWORD(-1);
    }
 
    DWORD readed = 0;                   // discard results
    STORAGE_DEVICE_NUMBER number;       //use this to get disk numbers
    BOOL result = DeviceIoControl(
                hDevice,                // handle to device
                IOCTL_STORAGE_GET_DEVICE_NUMBER, // dwIoControlCode
                NULL,                            // lpInBuffer
                0,                               // nInBufferSize
                &number,           // output buffer
                sizeof(number),         // size of output buffer
                &readed,       // number of bytes returned
                NULL      // OVERLAPPED structure
            );
    if (!result) // fail
    {
        fprintf(stderr, "IOCTL_STORAGE_GET_DEVICE_NUMBER Error: %ld\n", GetLastError());
        (void)CloseHandle(hDevice);
        return (DWORD)-1;
    }
    //printf("%d %d %d\n\n", number.DeviceType, number.DeviceNumber, number.PartitionNumber);
 
    (void)CloseHandle(hDevice);
    return number.DeviceNumber;
}

2.3 获取所有的逻辑盘符

int GetAllDisk(std::vector<CString>& vecDrives)
{
 char szbuf[MAX_PATH] = {0};
 GetLogicalDriveStringsA(MAX_PATH,szbuf);
 
 int nCount  = 0;
 char * pDrive = szbuf;
 for(int nlen =strlen(szbuf); nlen == 3 ;nCount++)
 {  
  CString strDrive = pDrive;
  vecDrives.push_back(strDrive);
  pDrive +=4;
  nlen = strlen(pDrive);
 } 
 return nCount;
}

2.4. 获取所有的卷

int GetAllVolume(vector<CString>& vstrVolume)
{
	CHAR  DeviceName[MAX_PATH] = "";
	DWORD  Error                = ERROR_SUCCESS;
	HANDLE FindHandle           = INVALID_HANDLE_VALUE;
	BOOL   Found                = FALSE;
	size_t Index                = 0;
	BOOL   Success              = FALSE;
	CHAR  VolumeName[MAX_PATH] = "";
	int nVolumeCnt = 0;
	//
	//  Enumerate all volumes in the system.
	FindHandle = FindFirstVolume(VolumeName, ARRAYSIZE(VolumeName));

	if (FindHandle == INVALID_HANDLE_VALUE)
	{
		Error = GetLastError();
		return 0;
	}

	for (;;)
	{
		//
		//  Skip the \\?\ prefix and remove the trailing backslash.
		if (VolumeName[0]     != L'\\' ||
			VolumeName[1]     != L'\\' ||
			VolumeName[2]     != L'?'  ||
			VolumeName[3]     != L'\\' ||
			VolumeName[Index] != L'\\') 
		{
			Error = ERROR_BAD_PATHNAME;
			break;
		}
		nVolumeCnt++;
		vstrVolume.push_back(VolumeName);

		//  Move on to the next volume.
		Success = FindNextVolume(FindHandle, VolumeName, ARRAYSIZE(VolumeName));

		if ( !Success ) 
		{
			Error = GetLastError();

			if (Error != ERROR_NO_MORE_FILES) 
			{
				break;
			}

			//
			//  Finished iterating
			//  through all the volumes.
			Error = ERROR_SUCCESS;
			break;
		}
	}

	FindVolumeClose(FindHandle);
	FindHandle = INVALID_HANDLE_VALUE;

	return nVolumeCnt;
}

2.5. 通过挂载点获取卷名

	char szMountPointName[MAX_PATH]="J:\\";
	char szVolumeName[MAX_PATH]="";
	GetVolumeNameForVolumeMountPoint(szMountPointName,szVolumeName,MAX_PATH);

2.6. 遍历所有的卷、卷路径、挂载点

#include <windows.h>
#include <stdio.h>

void DisplayVolumePaths(
        __in PWCHAR VolumeName
        )
{
    DWORD  CharCount = MAX_PATH + 1;
    PWCHAR Names     = NULL;
    PWCHAR NameIdx   = NULL;
    BOOL   Success   = FALSE;

    for (;;) 
    {
        //
        //  Allocate a buffer to hold the paths.
        Names = (PWCHAR) new BYTE [CharCount * sizeof(WCHAR)];

        if ( !Names ) 
        {
            //
            //  If memory can't be allocated, return.
            return;
        }

        //
        //  Obtain all of the paths
        //  for this volume.
        Success = GetVolumePathNamesForVolumeNameW(
            VolumeName, Names, CharCount, &CharCount
            );

        if ( Success ) 
        {
            break;
        }

        if ( GetLastError() != ERROR_MORE_DATA ) 
        {
            break;
        }

        //
        //  Try again with the
        //  new suggested size.
        delete [] Names;
        Names = NULL;
    }

    if ( Success )
    {
        //
        //  Display the various paths.
        for ( NameIdx = Names; 
              NameIdx[0] != L'\0'; 
              NameIdx += wcslen(NameIdx) + 1 ) 
        {
            wprintf(L"  %s", NameIdx);
        }
        wprintf(L"\n");
    }

    if ( Names != NULL ) 
    {
        delete [] Names;
        Names = NULL;
    }

    return;
}

void __cdecl wmain(void)
{
    DWORD  CharCount            = 0;
    WCHAR  DeviceName[MAX_PATH] = L"";
    DWORD  Error                = ERROR_SUCCESS;
    HANDLE FindHandle           = INVALID_HANDLE_VALUE;
    BOOL   Found                = FALSE;
    size_t Index                = 0;
    BOOL   Success              = FALSE;
    WCHAR  VolumeName[MAX_PATH] = L"";

    //
    //  Enumerate all volumes in the system.
    FindHandle = FindFirstVolumeW(VolumeName, ARRAYSIZE(VolumeName));

    if (FindHandle == INVALID_HANDLE_VALUE)
    {
        Error = GetLastError();
        wprintf(L"FindFirstVolumeW failed with error code %d\n", Error);
        return;
    }

    for (;;)
    {
        //
        //  Skip the \\?\ prefix and remove the trailing backslash.
        Index = wcslen(VolumeName) - 1;

        if (VolumeName[0]     != L'\\' ||
            VolumeName[1]     != L'\\' ||
            VolumeName[2]     != L'?'  ||
            VolumeName[3]     != L'\\' ||
            VolumeName[Index] != L'\\') 
        {
            Error = ERROR_BAD_PATHNAME;
            wprintf(L"FindFirstVolumeW/FindNextVolumeW returned a bad path: %s\n", VolumeName);
            break;
        }

        //
        //  QueryDosDeviceW does not allow a trailing backslash,
        //  so temporarily remove it.
        VolumeName[Index] = L'\0';

        CharCount = QueryDosDeviceW(&VolumeName[4], DeviceName, ARRAYSIZE(DeviceName)); 

        VolumeName[Index] = L'\\';

        if ( CharCount == 0 ) 
        {
            Error = GetLastError();
            wprintf(L"QueryDosDeviceW failed with error code %d\n", Error);
            break;
        }

        wprintf(L"\nFound a device:\n %s", DeviceName);
        wprintf(L"\nVolume name: %s", VolumeName);
        wprintf(L"\nPaths:");
        DisplayVolumePaths(VolumeName);

        //
        //  Move on to the next volume.
        Success = FindNextVolumeW(FindHandle, VolumeName, ARRAYSIZE(VolumeName));

        if ( !Success ) 
        {
            Error = GetLastError();

            if (Error != ERROR_NO_MORE_FILES) 
            {
                wprintf(L"FindNextVolumeW failed with error code %d\n", Error);
                break;
            }

            //
            //  Finished iterating
            //  through all the volumes.
            Error = ERROR_SUCCESS;
            break;
        }
    }

    FindVolumeClose(FindHandle);
    FindHandle = INVALID_HANDLE_VALUE;

    return;
}

2.7. 获取所有的磁盘设备路径


DWORD GetAllDiskDevicePath(vector<CString>& vstrDevice)
{
	GUID* guid = (GUID*)&GUID_DEVINTERFACE_DISK;

	// Get device interface info set handle
	// for all devices attached to system
	HDEVINFO hDevInfo = SetupDiGetClassDevs(guid, NULL, NULL,
		DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);

	if ( hDevInfo == INVALID_HANDLE_VALUE )  {
		return 0;
	}

	// Retrieve a context structure for a device interface
	// of a device information set.
	DWORD dwIndex = 0;
	BOOL bRet = FALSE;

	BYTE Buf[1024];
	PSP_DEVICE_INTERFACE_DETAIL_DATA pspdidd = (PSP_DEVICE_INTERFACE_DETAIL_DATA)Buf;
	SP_DEVICE_INTERFACE_DATA         spdid;
	SP_DEVINFO_DATA                  spdd;
	DWORD                            dwSize;

	spdid.cbSize = sizeof(spdid);

	while ( true )  
	{
		bRet = SetupDiEnumDeviceInterfaces(hDevInfo, NULL, guid, dwIndex, &spdid);
		if ( !bRet )
		{
			break;
		}

		dwSize = 0;
		SetupDiGetDeviceInterfaceDetail(hDevInfo, &spdid, NULL, 0, &dwSize, NULL);

		if ( dwSize!=0 && dwSize<=sizeof(Buf) ) 
		{
			pspdidd->cbSize = sizeof(*pspdidd); // 5 Bytes!

			ZeroMemory((PVOID)&spdd, sizeof(spdd));
			spdd.cbSize = sizeof(spdd);

			long res = SetupDiGetDeviceInterfaceDetail(hDevInfo, &spdid, pspdidd,
				dwSize, &dwSize, &spdd);
			if ( res ) 
			{
				vstrDevice.push_back(pspdidd->DevicePath);
			}
		}
		dwIndex++;
	}

	SetupDiDestroyDeviceInfoList(hDevInfo);

	return dwIndex;
}
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
接到一个任务,禁止集团内所有电脑的USB接口进行文件拷贝,但不能妨碍打印机、鼠标键盘、扫描仪、加密狗等等一切需要USB接口工作的外部设备。 纠结了,这不摆明了让我蛋疼吗? 不过,疼归疼,办法总是要想滴,说白了不就是不让人把公司的机密资料带出去吗?现在这些人,暴力管理还找一大堆冠冕堂皇的理由让你无条件服从,P服!哥们我楞是从中总结出一条真理:世界上没有办不到的事,只是你愿不愿意想办法。 不罗嗦,开工,首先了解任务的详细内容: 任务目的: 1、要管制USB存储设备,一般用户不能写不能读;部分用户能读不能写入USB存储设备;还有一部分大人们(公司高管)平时不读不写,在需要用的时候要能读能写! 2、无论使用什么方式进行管制,不能影响到现在USB打印机、扫描仪、加密狗、鼠标键盘等等外部设备的使用。 额滴神,这帮兔崽子真会折磨人。 任务范围:集团内800+台电脑 任务时间:2周 接下来,就得找实施方案了! 1、方案一:BIOS里全部关闭USB端口 2、方案二:Client端安装USB管理软件,用软件进行管制,安装一台服务器,监控所有电脑的USB动态 3、方案三:从操作系统注册表下手,批处理执行管理 先说说这三个方案:恕本人愚昧,或许还有很多又好又快捷的方法,但偶当时确实只想到这些, 方案一:最操蛋的方法,端口全关了,什么USB设备都用不了了,就别提这机那机了,PASS掉, 方案二:所有电脑安装Client,工作量大,时间根本不够,再说了,我很介意在用户端安装软件,多一个进程多占用一部分内存,到时候电脑速度慢了又会有人大呼小叫了。仍然PASS, 第三个,其实这也是俺最喜欢用的手段:批处理!哈哈,就它了。 各位观众,看清楚看明白啦,实施过程开始! 1、首先,关闭USB存储设备的盘符自动分配,打开注册表,找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\USBSTOR,将”Start”的值改为4(禁止自动启动),默认为3是自动分配盘符 2、干掉USB存储设备的作用文件:进入WINDOWS系统目录,找到X:\Windows\inf,这里说明一下,USB存储设备的作用文件有两个,分别是usbstor.inf和usbstor.pnf,因为后续可能需要重新打开USB功能,所以不要删除它,建议拷贝到其他位置,当然你要暴力一点,删除它也没关系,但记得做好备份。 我用两条批处理指令实现: copy %Windir%\inf\usbstor.inf %Windir%\usbstor.inf /y >nul copy %Windir%\inf\usbstor.pnf %Windir%\usbstor.pnf /y >nul del %Windir%\inf\usbstor.pnf /q/f >nul del %Windir%\inf\usbstor.inf /q/f >nul 哦不,准确的说是4行指令! 3、然后,禁止将电脑里的资料拷贝到USB存储设备,意思是把USB存储设备设置只读的,干成残废。 打开注册表:定位到HKEY_LOCAL_MACHINE\SYSTEM \CurrentControlSet\Control,在其下新建一个名为“StorageDevicePolicies”的项,选中它,在右边的窗格中新建一个名为“WriteProtect”的DWORD值,并将其数值数据设置为1 嘿嘿,有了这一条,你就是能用USB存储设备,也只能单方面读取数据了,也算是半个残废了。 到此,基本上第一个过程基本完成,实现的功能包括:禁止使用USB存储设备,不影响其他USB外设,就算要用,也把USB存储设备干成残废(只读)。 接下来说第二个部分:如何开启?(部分用户需要使用USB存储设备) 实际上,逆向操作以上步骤就可以完成开启,但为了表达的更完整一些,我还是把过程写下来 1、找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\USBSTOR,将”Start”的值改为3 2、恢复USB存储设备作用文件,还是4行指令: copy %Windir%\usbstor.inf %Windir%\inf\usbstor.inf /y >nul copy %Windir%\usbstor.pnf %Windir%\inf\usbstor.pnf /y >nul del %Windir%\usbstor.pnf /q/f >nul del %Windir%\usbstor.inf /q/f >nul 完成后,用户可使用USB存储设备,但不能往里面写入任何内容!你不信?不信就试试嘛,俗话说的好:实践出真知! 不好意思,扯远了! 这样,关闭也写了,开启也写了,接下来的事情,你知道的。 批处理代码,哈哈! 关闭过程: @echo off reg add “HKEY_LOCAL_ MACHINESYSTEMCurrentControlSet ControlStorageDevicePolicies“ /v WriteProtect /t reg_dword /d 1 /f reg add “HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\USBSTOR” /v Start /t reg_dword /d 4 /f copy %Windir%\inf\usbstor.inf %Windir%\usbstor.inf /y >nul copy %Windir%\inf\usbstor.pnf %Windir%\usbstor.pnf /y >nul del %Windir%\inf\usbstor.pnf /q/f >nul del %Windir%\inf\usbstor.inf /q/f >nul @echo on 开启过程: @echo off reg add “HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\USBSTOR” /v Start /t reg_dword /d 3 /f copy %Windir%\usbstor.inf %Windir%\inf\usbstor.inf /y >nul copy %Windir%\usbstor.pnf %Windir%\inf\usbstor.pnf /y >nul del %Windir%\usbstor.pnf /q/f >nul del %Windir%\usbstor.inf /q/f >nul @echo on 将以上代码保存为两个BAT文档,然后放进x:\Windows\system32\目录下,比如DisableUSB.bat和EnableUSB.bat 然后直接在运行里面输入指令:DisableUSB (关闭)EnableUSB(开启) 打完收工!
获取USB摄像头的1080p的JPEG格式的图片20180608_1806.7z 电脑上的系统:ubuntu14.04 // http://www.linuxidc.com/Linux/2011-03/33020.htm // V4L2摄像头获取单幅图片测试程序(MMAP模式) // [日期:2011-03-06] 来源:Linux社区 作者:aokikyon [字体:大 中 小] // // #加了点注释 // // #Rockie Cheng // printf #include #include // memset #include #include #include #include // close write usleep read #include #include #include #include #include #include // mmap #include #include #include #include // pthread_create pthread_join #include #define CLEAR(x) memset (&(x), 0, sizeof (x)) #define REQ_COUNT 6 #define uchar unsigned char struct buffer { void * start; size_t length; }; static char * dev_name = "/dev/video0";//摄像头设备名 static int fd = -1; struct buffer * buffers = NULL; // static unsigned int n_buffers = 0; // 2012-7-13 11:33 camera flag // static int iFlagCamera = 0; volatile int iFlagCamera = 0; // 函数名称:thread1 // 函数功能:用于接受键盘的输入,之后通知thread2抓图 // 参数列表: // 返回值 : void thread1(void) { char ch; printf("\n !!!!Warning!!!!\n Max 1000 color bmp\n Input the char: \n"); printf("\n !!!!press o an capture 1 frame picture! \n"); printf("\n !!!!press t an capture 10 frame picture! \n"); printf("\n !!!!press h an capture 100 frame picture! \n"); while(1) { while((ch=getchar()) != '\n') { printf("%c\n", ch); if('o'==ch) { iFlagCamera = 1; printf("thread1=%d\n", iFlagCamera); } else if('t'==ch) { iFlagCamera = 10; printf("thread1=%d\n", iFlagCamera); } else if('h'==ch) { iFlagCamera = 101; printf("thread1=%d\n", iFlagCamera); } else if('q'==ch) { iFlagCamera = 10001; printf("thread1=%d\n", iFlagCamera
1、方案一:BIOS里全部关闭USB端口 或用管理员帐号登陆,设备管理器里停用 2、方案二:Client端安装USB管理软件,用软件进行管制,安装一台服务器,监控所有电脑的USB动态 3、方案三:从操作系统注册表下手,批处理执行管理 检查和分析: 先说说这三个方案:恕本人愚昧,或许还有很多又好又快捷的方法,但偶当时确实只想到这些, 方案一:最操蛋的方法,端口全关了,如果不关完,别人也会拔掉USB设备进行COPY资料,这样什么USB设备都用不了了,就别提这机那机了,那仪了,直接PASS掉。 方案二:所有电脑安装Client,工作量大,时间根本不够,再说了,我很介意在用户端安装软件,多一个进程多占用一部分内存,到时候电脑速度慢了又会有人大呼小叫了,仍然PASS。 第三个,其实这也是俺最喜欢用的手段:批处理!哈哈,就它了。 行动: 1、首先,关闭USB存储设备的盘符自动分配,打开注册表,找到HKEY_LOCAL_MACHINE\SYSTEM \CurrentControlSet\Services\USBSTOR,将"Start"的值改为4(禁止自动启动),默认为3是自动分配盘符 2、干掉USB存储设备的作用文件:进入WINDOWS系统目录,找到X:\Windows\inf,这里说明一下,USB存储设备的作用文件有两个,分别是usbstor.inf和usbstor.pnf,因为后续可能需要重新打开USB功能,所以不要删除它,建议拷贝到其他位置,当然你要暴力一点,删除它也没关系,但记得做好备份。 我用两条批处理指令实现: copy %Windir%\inf\usbstor.inf %Windir%\usbstor.inf /y >nul copy %Windir%\inf\usbstor.pnf %Windir%\usbstor.pnf /y >nul del %Windir%\inf\usbstor.pnf /q/f >nul del %Windir%\inf\usbstor.inf /q/f >nul 哦不,准确的说是4行指令! 3、然后,禁止将电脑里的资料拷贝到USB存储设备,意思是把USB存储设备设置只读的,干成残废。 打开注册表:定位到HKEY_LOCAL_MACHINE\SYSTEM \CurrentControlSet\Control,在其下新建一个名为“StorageDevicePolicies”的项,选中它,在右边的窗格中新建一个名为“WriteProtect”的DWORD值,并将其数值数据设置为1 嘿嘿,有了这一条,你就是能用USB存储设备,也只能单方面读取数据了,也算是半个残废了。 到此,基本上第一个过程基本完成,实现的功能包括:禁止使用USB存储设备,不影响其他USB外设,就算要用,也把USB 存储设备干成残废(只读)。 接下来说第二个部分:如何开启?(部分用户需要使用USB存储设备) 实际上,逆向操作以上步骤就可以完成开启,但为了表达的更完整一些,我还是把过程写下来 1、找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services \USBSTOR,将"Start"的值改为3 2、恢复USB存储设备作用文件,还是4行指令: copy %Windir%\usbstor.inf %Windir%\inf\usbstor.inf /y >nul copy %Windir%\usbstor.pnf %Windir%\inf\usbstor.pnf /y >nul del %Windir%\usbstor.pnf /q/f >nul del %Windir%\usbstor.inf /q/f >nul 完成后,用户可使用USB存储设备,但不能往里面写入任何内容!你不信?不信就试试嘛,俗话说的好:实践出真知! 不好意思,扯远了! 这样,关闭也写了,开启也写了,接下来的事情,你知道的。 批处理代码,哈哈! 关闭过程: @echo off reg add "HKEY_LOCAL_ MACHINESYSTEMCurrentControlSet ControlStorageDevicePolicies“ /v WriteProtect /t reg_dword /d 1 /f reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\USBSTOR" /v Start /t reg_dword /d 4 /f copy %Windir%\inf\usbstor.inf %Windir%\usbstor.inf /y >nul copy %Windir%\inf\usbstor.pnf %Windir%\usbstor.pnf /y >nul del %Windir%\inf\usbstor.pnf /q/f >nul del %Windir%\inf\usbstor.inf /q/f >nul @echo on 开启过程: @echo off reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\USBSTOR" /v Start /t reg_dword /d 3 /f copy %Windir%\usbstor.inf %Windir%\inf\usbstor.inf /y >nul copy %Windir%\usbstor.pnf %Windir%\inf\usbstor.pnf /y >nul del %Windir%\usbstor.pnf /q/f >nul del %Windir%\usbstor.inf /q/f >nul @echo on 将以上代码保存为两个BAT文档,然后放进x:\Windows\system32\目录下,比如 DisableUSB.bat和EnableUSB.bat 然后直接在运行里面输入指令:DisableUSB (关闭)EnableUSB(开启) 别让USER知道了哟............。
鼎昌USB外存设备访问监控平台(mobile Storage Media Management DC-SMM)是针对USB外存设备(如U盘、移动硬盘、MP3等)管理、访问而设计的安全防护系统、DC-SMM采用身份认证、访问控制技术,统一管控USB外存设备的使用,提供不同的安全策略,详细记录使用过程。确保数据存储和流通的安全性、使用和管理的规范性,不影响使用的灵活性。将企业USB外存设备管理提升到全新的高度,实现以下效果: 外来设备进不来:自动鉴别设备来源,外来存储设备拒绝使用。 内部数据出不去:外存设备在外部禁止使用的安全策略下,离开企业不能使用。 外存设备不怕丢:数据存储在安全加密区,即使丢失也不担心泄密。 使用过程全监控:哪个设备哪个时段在哪台电脑上访问过哪些文件做过哪些操作记录得一清二楚。 产品功能: 1、统一管理:对USB外存设备的注册、授权、注销统一管理,外存设备未经认证无法使用。 建立外存设备与人员的对应关系,方便对设备使用者的监管; 随时查询和设置设备的使用权限。 2、权限策略:禁用、只读、读写权限。 3、安全策略:支持“仅允许内部使用”和“内外部均可使用”。 外存设备注册认证后,根据安全策略、适用范围方可在内、外部计算机上使用,追踪设备的使用记录。 4、控制范围:控制外存设备在企业内部哪些部门或者哪些机器上使用。 防止外存设备任意访问他人或其他部门机器。 5、限制时效:根据需要可设置设备的使用时效,如:起止日期或永久使用。 方便外来存储设备在企业内部临时短暂使用。 6、授权信息:已授权的设备信息记录完整,可导出EXCEL报表。 方便外来存储设备的统一管理情况。 7、日志审计:外存设备所有文件操作均有详细记录(复制、删除、移动、新建、打开、重命名等),便于对外存设备使用情况进行安全审计,一旦外存设备接入内部计算机则自动上传使用记录。日志记录可根据外存设备持有者、时间范围查询使用记录;使用记录可导出报表。 通过查看记录,分析是否存在泄密隐患; 数据泄漏时可以分析查询日志,查找根源,确定泄密事件,追踪泄密责任。 8、分组、人员管理:对人员和机器可实现统一分组管理,对计算机可实现自动搜索和手动配置。 9、外部使用口令审查:安全口令认证方式,记录详细的文件操作以备安全审计。 产品特点:     DC-SMM采用操作系统内核底层驱动开发技术、鼎昌独创的高强度加密算法和混合智能编码技术,能实现“正品和非正品”外存设备统一安全访问控制,确保外存设备始终处于安全的监控之内。 1、设备准入监控 2、操作简单、设置灵活 向导式操作模式,友好的提醒通知 权限设置清晰,分组、人员设置简单 3、访问有痕、日志监控 所有文件操作均有记录,追踪有据 准确的记录信息方面安全审计 4、丰富的统计分析 监控记录多查询方式 查询结果多输出方式 5、合理的系统架构 功能组件式架构,支持单机局域网操作 预留应用接口,可满足扩展 6、底层驱动开发 安全性更高,抗攻击能力强 7、兼容性强 支持Windows XP、Windows Server 2000/2003/2008、Windows7 与Windows域管理完全兼容 支持USB1.0、2.0、3.0接口
如果你需要在 PyCharm 中使用 PyQt5,但是没有网络连接或者网络连接不稳定,可以通过离线安装的方式来安装 PyQt5。下面是具体的步骤: 1. 下载 PyQt5 安装包 在另一台已经联网的计算机上下载 PyQt5 的安装包,可以从 PyQt5 的官方网站(https://www.riverbankcomputing.com/software/pyqt/download5)下载适合你系统的安装包。 2. 将安装包复制到离线计算机 将下载好的安装包复制到离线计算机中,可以通过 USB 等移动存储设备进行复制。 3. 安装 PyQt5 在离线计算机中,打开 PyCharm 并进入设置界面。在设置界面中,选择 "Project Interpreter" 选项,然后点击右上角的齿轮图标,选择 "Install from disk" 选项。在弹出的对话框中,选择之前复制到离线计算机中的 PyQt5 安装包,然后点击 "OK" 开始安装。 4. 配置 PyCharm 安装完成后,需要在 PyCharm 中配置 PyQt5。在设置界面中,选择 "Project Interpreter" 选项,然后选择安装了 PyQt5 的 Python 解释器。在解释器详情页面中,点击右侧的 "Show paths for the selected interpreter" 按钮,在弹出的对话框中添加以下路径: - PyQt5 的安装路径 - PyQt5 的 bin 目录路径 - Qt 的 bin 目录路径 配置完成后,就可以在 PyCharm 中使用 PyQt5 了。 注意:离线安装 PyQt5 的过程可能会比在线安装复杂一些,需要手动解决依赖关系和路径问题。如果你不熟悉这些操作,建议在有网络连接的计算机上进行安装和配置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值