我的用户是管理员(我在配置面板中看到它),下面的代码抛出一个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);
}
}
如果您想要更多代码,请问: - )
由于
答案 0 :(得分:1)
重新发布评论记录,管理员组中的用户在Vista / Server 2008及更高版本上没有管理员权限,除非进程升级。要使Windows显示UAC提升提示,需要A manifest。
这对于由Run注册表项或Startup文件夹在登录时启动的程序不起作用。 Windows拒绝显示提升提示,因为用户无法准确猜出 程序要求提升的内容。使用证书对程序进行代码签名可能会解决此问题,因为它允许Windows验证并显示程序所有者,从未实际尝试过。
此类程序的变通方法是将其作为服务或计划任务激活。这两者都不需要清单。这种看似奇怪的背后的理论是,它已经需要提升才能安装服务或计划任务。