web-dev-qa-db-ja.com

C#Winformsプログラムを任意のコンピューターで管理者として実行するにはどうすればよいですか?

C#Winformsプログラムを任意のコンピューターで管理者として実行するにはどうすればよいですか?そして、どんな種類のOS?

コードソリューションが必要です(サンプルコードはどれでも優れています)

前もって感謝します

30
Gold

このマニフェストをアプリケーションに埋め込むことができます。

<?xml version="1.0" encoding="utf-8" ?> 
<asmv1:Assembly manifestVersion="1.0" xmlns="urn:schemas-Microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-Microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-Microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <assemblyIdentity version="1.0.0.0" name="MyApplication" />
    <trustInfo xmlns="urn:schemas-Microsoft-com:asm.v2">
        <security>
            <requestedPrivileges xmlns="urn:schemas-Microsoft-com:asm.v3">
                <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
            </requestedPrivileges>
        </security>
    </trustInfo>
</asmv1:Assembly>  
52
Alex Reitbort

以下は、管理者としてアプリケーションを実行するためのサンプルコードです。

ProcessStartInfo proc = new ProcessStartInfo();
proc.UseShellExecute = true;
proc.WorkingDirectory = Environment.CurrentDirectory;
proc.FileName = Application.ExecutablePath;
proc.Verb = "runas";
try
{
    Process.Start(proc);
}
catch
{
    // The user refused the elevation.
    // Do nothing and return directly ...
    return;
}
Application.Exit();  // Quit itself

ProcessStartInfo.Verbを「runas」に設定すると、管理者として実行できます。関連FAQ

http://social.msdn.Microsoft.com/Forums/en-US/winforms/thread/28f84724-af3e-4fa1-bd86-b0d1499eaefa#x_FAQAnswer91

12
Sandeep Pathak

明白な答えは、C#プロジェクトにマニフェストファイルを追加し、次の行を追加することです。

_<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
_

しかし、かなり非正統的なアプローチをとることもできます。レジストリへのアクセスには管理者権限が必要であることはわかっています。したがって、レジストリ書き込みアクセスを含む関数がある場合、管理者としてプログラムを実行しないと、関数は_System.Security.SecurityException_をスローします。プログラムの最初にこの関数を呼び出さなければならないことが暗示されています。この例外がスローされた場合、管理者としてプログラムを実行し、プログラムを閉じるようにユーザーに通知できます。

_public void enforceAdminPrivilegesWorkaround()
{
    RegistryKey rk;
    string registryPath = @"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\";

    try
    {
        if(Environment.Is64BitOperatingSystem)
        {
            rk = RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, RegistryView.Registry64);
        }
        else
        {
            rk = RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, RegistryView.Registry32);
        }

        rk = rk.OpenSubKey(registryPath, true);
    }
    catch(System.Security.SecurityException ex)
    {
        MessageBox.Show("Please run as administrator");
        System.Environment.Exit(1);
    }
    catch(Exception e)
    {
        MessageBox.Show(e.Message);
    }
}
_

ここでは、rk = rk.OpenSubKey(registryPath, true)行のtrueは、レジストリへの書き込みアクセスが必要であることをプログラムに伝えています。

2
ihayet

マニフェストファイルが必要です。マニフェストファイルを配置して、AsInvokerまたはAsAdministratorを選択するだけです。

プロセスにアクセスできる場合は、proc.Verb = "runas"を使用できます。

これを確認してください: http://social.msdn.Microsoft.com/Forums/en-US/winforms/thread/db6647a3-85ca-4dc4-b661-fbbd36bd561f

1
abhishek