2

セキュリティ記述子 HKR,,Security,,"D:P(A;;GA;;;SY)(A;;GA;;;BA)" を持つ .INF があります。

このセキュリティ記述子を変更して、管理者権限を削除しました。すべてのユーザーがアプリケーションを開くことができるようにします。私が使用した記述子は「D:P(A;;GA;;;WD)(A;;GA;;;BU)(A;;GA;;;S-1-1-0)」ですドライバーをアンインストールしましたデバイス マネージャーで、変更された .INF ファイルを再インストールしました。ただし、INF ファイルでデバイスの「クラス」と「ClassGUID」を変更しないと機能しません。

デバイスマネージャーからドライバーを削除しても、以前にインストールされたセキュリティ記述子が削除されていないと思います。また、devcon を使用してドライバーを削除しました。ただし、デバイス クラスは削除されませんでした。

私がそれを機能させる唯一の方法は、既存の .INF ファイルの "Class" と "ClassGUID" を変更することです。

以前に Windows にインストールされたドライバーのデバイス クラスを削除するにはどうすればよいですか? Windows 7 を使用しています。

4

2 に答える 2

1

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
于 2016-08-10T15:25:35.183 に答える
0

小さな 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;
 }
于 2015-10-15T05:11:22.690 に答える