2012-04-06 28 views
0

私のユーザーは管理者です(設定パネルに表示されます)。以下のコードではAccess DeniedというWin32Exceptionがスローされますが、これをどのように変更できますか(Win7 32ビット)?SetupDiChangeStateがアクセスを拒否する

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

マニフェストを追加して、プログラムがUACのアクセス許可が高い状態で実行されるようにしましたか? –

+0

[Windows 7でC#アプリケーションを管理者として実行する方法](http://stackoverflow.com/questions/2818179/how-to-force-c-sharp-app-to-run-as-administrator) -on-windows-7) –

+0

@HansPassant:どうすればいいですか?聞いたことがない:/ –

答えて

1

をお願いし、管理者グループのユーザーはVistaの/ Server 2008上で管理者権限を持っていないと後でプロセスが上昇しない限り、 WindowsにUAC昇格のプロンプトを表示するには、A manifestが必要です。

これは、実行時レジストリキーまたはスタートアップフォルダによってログイン時に起動されたプログラムでは機能しません。ユーザーが正確にと推測することができないため、Windowsは昇格のプロンプトを表示することを拒否しました。プログラムは昇格を求めました。プログラムで証明書を使ってコードを署名すると、Windowsがプログラムの所有者を確認して表示することができます。

このようなプログラムの回避策は、サービスまたはスケジュールされたタスクとしてこのプログラムをアクティブ化しています。どちらもマニフェストを必要としない。このように見える不思議の背景にある理論は、すでにサービスまたはスケジュールされたタスクをインストールするには高度が必要であるということです。

+0

サービスが作成され、ユーザーアカウントで実行されましたが、UIは表示されません(デスクトップとの非対話性のため?)。私は今これの回避策を見つける必要があります。 Win7 +では、何も簡単です... –

関連する問題