0

私のユーザーは管理者です(構成パネルに表示されます)。次のコードはWin32Exceptionをスローし、これAccess Deniedを変更するにはどうすればよいですか(Win7 32ビット)?

static Guid VideoGuid = new Guid("4d36e968-e325-11ce-bfc1-08002be10318");

[SecurityPermission(SecurityAction.Demand, UnmanagedCode = true)]
static void Main(string[] args)
{
    SafeDeviceHandle handle = null;
    try
    {
        handle = NativeMethods.SetupDiGetClassDevs(ref VideoGuid, IntPtr.Zero, IntPtr.Zero, NativeMethods.DIGCF.PRESENT);
        var data = new NativeMethods.SP_DEVINFO_DATA().Initialize();
        var param = new NativeMethods.SP_PROPCHANGE_PARAMS().Initialize();
        param.ClassInstallHeader.InstallFunction = 0x12;
        param.StateChange = NativeMethods.DICS.ENABLE; // 0x01
        param.Scope = NativeMethods.DICS_GLOBAL.GLOBAL; // 0x01
        param.HwProfile = 0;

        RunWin32Method(() => NativeMethods.SetupDiEnumDeviceInfo(handle, 0u, out data));
        RunWin32Method(() => NativeMethods.SetupDiSetClassInstallParams(handle, ref data, ref param, (UInt32)Marshal.SizeOf(param)));
        RunWin32Method(() => NativeMethods.SetupDiChangeState(handle, ref data));
    }
    catch
    {
        var w = new Win32Exception(Marshal.GetLastWin32Error());
    }
    finally
    {
        if (handle != null && (!handle.IsInvalid))
            handle.Close();
    }
}

static void RunWin32Method(Func<bool> f)
{
    if (!f())
    {
        Debug.WriteLine(new Win32Exception(Marshal.GetLastWin32Error()).Message);
    }
}

より多くのコードが必要な場合は、質問してください:-)

ありがとう

4

1 に答える 1

1

コメント証跡を要約すると、管理者グループのユーザーは、プロセスが昇格して実行されない限り、Vista /Server2008以降の管理者権限を持っていません。 WindowsでUAC標高プロンプトを表示するには、マニフェストが必要です。

これは、Runレジストリキーまたはスタートアップフォルダによるログイン時に開始されたプログラムでは機能しません。ユーザーがどのプログラムが標高を要求したかを正確に推測できないため、Windowsは標高プロンプトの表示を拒否します。証明書を使用してプログラムにコード署名すると、Windowsがプログラムの所有者を確認して表示できるようになるため、これが修正される可能性があります。実際に試したことはありません。

このようなプログラムの回避策は、サービスまたはスケジュールされたタスクとしてアクティブ化することです。どちらもマニフェストを必要としません。この一見奇妙なことの背後にある理論は、サービスまたはスケジュールされたタスクをインストールするためにすでに昇格が必要であるというものです。

于 2012-04-06T19:20:11.430 に答える