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