我有一个带有安全描述符HKR的.INF,安全,“D:P(A;;GA;SY)(A;;GA;BA)”。
我更改了此安全描述符,以删除管理员权限。这样任何用户都可以打开该应用程序。我使用的描述符是"D:P(A;;GA;;;WD)(A;;GA;;;BU)(A;;GA;;;S-1-1-0)“,我在设备管理器中卸载了驱动程序,并重新安装了修改后的.INF文件。但是,除非我在INF文件中更改设备的"class“和"ClassGUID”,否则它不会工作。
我认为即使我从设备管理器中删除了驱动程序,之前安装的安全描述符也没有被删除。我还使用devcon删除了驱动程序。但它没有删除设备类别。
我能让它工作的唯一方法是修改现有.INF文件的"Class“和"ClassGUID”。
如何在windows中删除以前安装的驱动程序的设备类别?我使用的是Windows 7。
发布于 2016-08-10 23:25:35
使用SetupAPI,您还可以更改SDS。这不能直接回答您的问题,但它确实解决了没有更新安全描述符的问题。
static GUID MY_GUID = { 0x91A3EB99, 0x5FB7, 0x4CA4, { 0x83, 0xC9, 0x8E, 0x39, 0xC1, 0x39, 0xEF, 0xE8 } };
SetClassSDS(&MY_GUID);如果需要,也可以只传入从SetupDiClassGuidsFromNameEx检索到的GUID:
SetClassSDS(&cls);这是我在上面使用的函数(请确保使用您想要的ACL ):
void SetClassSDS(GUID* guid)
{
wprintf(L"\tGUID: {%08lX-%04hX-%04hX-%02hhX%02hhX-%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX}\n",
guid->Data1, guid->Data2, guid->Data3, guid->Data4[0], guid->Data4[1], guid->Data4[2],
guid->Data4[3], guid->Data4[4], guid->Data4[5], guid->Data4[6], guid->Data4[7]);
const int strSize = 256;
// This discretionary ACL:
// * Deny access to Built-in Guests
// * Deny access to Anonymous Logon
// * Allow read/write/execute to Authenticated Users
// * Allow full control to Administrators
WCHAR newStr[strSize] = L"D:(D;OICI;GA;;;BG)(D;OICI;GA;;;AN)(A;OICI;GRGWGX;;;AU)(A;OICI;GA;;;BA)";
PBYTE str = new BYTE[strSize];
DEVPROPTYPE type;
DWORD reqSize = 0;
if (SetupDiGetClassProperty(guid, &DEVPKEY_DeviceClass_SecuritySDS, &type, str, strSize, &reqSize, DICLASSPROP_INSTALLER))
{
wprintf(L"\tCurrent SDS: %s\n", str);
wprintf(L"\tDesired SDS: %s\n", newStr);
if (SetupDiSetClassProperty(guid, &DEVPKEY_DeviceClass_SecuritySDS, type,
(BYTE*)newStr, sizeof(newStr), DICLASSPROP_INSTALLER))
{
wprintf(L"\n\tSetupDiSetClassProperty succeeded\n\n");
}
else
{
wprintf(L"\tSetupDiSetClassProperty - Error code: 0x%X\n\n", GetLastError());
}
}
else
{
wprintf(L"\tSetupDiGetClassProperty - Error code: 0x%X\n\n", GetLastError());
if (reqSize > strSize)
{
wprintf(L"\tSecurity string too long\n");
}
}
wprintf(L"\n");
delete [] str;
}您将需要以下内容:
#include <initguid.h>
#include <devguid.h>
#include <devpkey.h>
#include <devpropdef.h>
#include <setupapi.h>您将需要链接到此库:
Setupapi.lib发布于 2015-10-15 13:11:23
我终于能够使用一个小的C++程序卸载device类。在下面的链接中,在站点的末尾,有一个C++代码,您可以完全删除驱动程序,包括与ClassGUID关联的ClassName。
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;
}https://stackoverflow.com/questions/33103252
复制相似问题