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/Server 2008 及更高版本上没有管理员权限,除非进程运行提升。 需要清单才能让 Windows 显示 UAC 提升提示。

这不适用于在登录时通过 Run 注册表项或 Startup 文件夹启动的程序。Windows 拒绝显示提升提示,因为用户无法准确猜测是哪个程序要求提升。使用证书对程序进行代码签名可能会解决此问题,因为这允许 Windows 验证和显示程序所有者,但实际上从未尝试过。

此类程序的解决方法是将其作为服务或计划任务激活。两者都不需要清单。这种看似奇怪的背后的理论是,它已经需要提升才能安装服务或计划任务。

于 2012-04-06T19:20:11.430 回答