UAC が有効になっている Windows Vista で、ログオン アカウントをプログラムで作成したいと考えています。
ユーザー アカウントを作成する OCX があり、NT と XP で何年も機能していましたが、Vista でアカウントを作成すると、アプリケーションが Access Denied で失敗します。お客様が UAC をオフにした場合、そのアプリをセットアップすると正常に動作します。ただし、ユーザーがアプリの構成を完了する前に UAC をオフにして再起動することは認められません。
UAC が有効になっている Windows Vista で、ログオン アカウントをプログラムで作成したいと考えています。
ユーザー アカウントを作成する OCX があり、NT と XP で何年も機能していましたが、Vista でアカウントを作成すると、アプリケーションが Access Denied で失敗します。お客様が UAC をオフにした場合、そのアプリをセットアップすると正常に動作します。ただし、ユーザーがアプリの構成を完了する前に UAC をオフにして再起動することは認められません。
Vista で管理者権限でアプリケーションを実行すると、動作しますか?
次のコードを使用して、昇格された特権を持つ COM オブジェクトを作成することもできます。
HRESULT __stdcall CreateElevatedComObject(HWND hwnd, REFCLSID rclsid, REFIID riid, __out IUnknown ** ppv)
{
OSVERSIONINFO ver={sizeof(ver)};
if (GetVersionEx(&ver) && ver.dwMajorVersion > 5)
{
BIND_OPTS3 bo;
WCHAR wszCLSID[50];
WCHAR wszMonikerName[300];
if (StringFromGUID2(rclsid, wszCLSID, ELEMENTS(wszCLSID)))
{
HRESULT hr = StringCchPrintf(wszMonikerName,
ELEMENTS(wszMonikerName),
L"Elevation:Administrator!new:%s",
wszCLSID);
if (FAILED(hr))
return hr;
memset(&bo, 0, sizeof(bo));
bo.cbStruct = sizeof(bo);
bo.hwnd = hwnd;
bo.dwClassContext = CLSCTX_LOCAL_SERVER;
return CoGetObject(wszMonikerName, &bo, riid, (void **)ppv);
}
return E_FAIL;
}
else
return ::CoCreateInstance(rclsid,NULL,CLSCTX_ALL,riid,(void**)ppv);
}
UAC で実行すると、昇格ダイアログが表示されます。オブジェクトは dllhost でプロセス外で実行されますが (私はそう思います)、完全な管理者権限を持っています。
また、Vista での UAC のステップ バイ ステップ ガイドも参照してください。
デプロイ時の UAC の扱いに関する別の記事を次に示します。すでにいくつかの vista 展開の問題を経験してきたので、幸運を祈ります。:)