セキュリティ記述子 HKR,,Security,,"D:P(A;;GA;;;SY)(A;;GA;;;BA)" を持つ .INF があります。
このセキュリティ記述子を変更して管理者権限を削除しました。これにより、どのユーザーでもアプリケーションを開くことができるようになります。ただし、INF ファイルでデバイス クラスと ClassGUID を変更しないと機能しません。
Windows に以前インストールしたドライバーのデバイス クラスを削除するにはどうすればよいですか?
デバイス マネージャーからドライバーを削除しても、以前にインストールされたセキュリティ記述子は削除されないと思います。
変更された INF ファイルでセキュリティ記述子を上書きできません。
答え1
小さな C++ プログラムを使用して、ようやくデバイス クラスをアンインストールできました。次のリンク (サイトの最後にあります) には、ClassGUID に関連付けられた ClassName を含むドライバーを完全に削除できる C++ コードがあります。
https://www.osronline.com/showthread.cfm?link=168171
以下にも同じコードをコピーしました。アンインストールを実行するための小さな MFC アプリケーションを作成しました。
HDEVINFO devs = INVALID_HANDLE_VALUE;
SP_DEVINFO_LIST_DETAIL_DATA devInfoListDetail;
SP_DEVINFO_DATA devInfo;
unsigned int DeviceNo = 0;
GUID cls;
DWORD numClass = 0;
TCHAR devID[MAX_DEVICE_ID_LEN];
SP_REMOVEDEVICE_PARAMS rmdParams;
SetupDiClassGuidsFromNameEx ("ClassName", &cls, 1, &numClass,
NULL, NULL);
devs = SetupDiGetClassDevsEx (&cls, NULL, NULL,
DIGCF_PRESENT, NULL, NULL, NULL);
devInfo.cbSize = sizeof(devInfo);
while (SetupDiEnumDeviceInfo (devs, DeviceNo++, &devInfo))
{
devInfoListDetail.cbSize = sizeof(devInfoListDetail);
if (!SetupDiGetDeviceInfoListDetail (devs, &devInfoListDetail) ||
CM_Get_Device_ID_Ex(devInfo.DevInst, devID,
MAX_DEVICE_ID_LEN/* 200 */, 0,
devInfoListDetail.RemoteMachineHandle))
{
break;
}
rmdParams.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER);
rmdParams.ClassInstallHeader.InstallFunction = DIF_REMOVE;
rmdParams.Scope = DI_REMOVEDEVICE_GLOBAL;
rmdParams.HwProfile = 0;
SetupDiSetClassInstallParams (devs, &devInfo,
&rmdParams.ClassInstallHeader,sizeof
(rmdParams));
SetupDiCallClassInstaller (DIF_REMOVE, devs, &devInfo);
}
SetupDiDestroyDeviceInfoList(devs);
DEVINST devRoot;
if(CM_Locate_DevNode_Ex(&devRoot,NULL,CM_LOCATE_DEVNODE_NORMAL,NULL) !=
CR_SUCCESS) {
goto final;
}
CM_Reenumerate_DevNode_Ex(devRoot, 0, NULL);
final:
return;
}