前のページ
本文由网友@nobody投稿,欢迎メッセージ技术论议。
管理者としてプロセスを開始するだけではなく、実際の開発プロセスで遭遇する状況ははるかに複雑になります。例えば、ユーザーがアプリケーションを開くと管理者モードで起動し、この時点では、もはや管理者モードで起動する必要はありません。例えば、ユーザーが無人の状況で使用されている場合、管理者の権限昇格のプロンプト動作を考慮する必要があり、“プロンプトなし、直接昇格”の場合にのみ管理者モードで起動します。例えば、アプリケーションAが管理者モードで起動するなど、管理者起動モードが渡されます。アプリケーションAがアプリケーションBを起動すると、通常、アプリケーションBはデフォルトでアプリケーションAの管理者権限を取得します。
本稿では、主に無人状況下で管理者によって開始される実装プロセスについて紹介する。それ以外の場合は,柔軟な組み合わせさえすれば実現できるはずである.
無人の主な特徴は、アプリケーションの起動、クラッシュ、再起動、プログラムの自動実行です。ユーザに確認を促したり、ユーザにアカウントパスワードを入力させたりするポップアップなど、プログラムの起動や実行を妨げる操作はプログラムにはありません。無人の状況を解決するために、主な解決アイデアは次の図のとおりです。

ユーザーのエンパワーメントアクションが“プロンプトなし、直接昇格”ではなく、管理者モードで開始する必要がある場合は、エンパワーメントアクションを変更する必要があります。“gpedit.msc”→“コンピュータの構成”→“Windowsの設定”→“セキュリティ設定”→“ローカルポリシー”→“セキュリティオプション”→“ユーザーアカウントの制御”を実行して、管理者のエスカレーションプロンプトの動作を管理承認モードで変更できます。
実装ステップは
プロセスで設計されたステップコードの実装方法を以下に示します。
- 現在のアプリケーションが管理者として起動されているかどうかを次のコードで確認します。
public static bool IsRunAsAdmin()
{
WindowsIdentity windowsIdentity = WindowsIdentity.GetCurrent();
WindowsPrincipal windows = new WindowsPrincipal(windowsIdentity);
if (windows.IsInRole(WindowsBuiltInRole.Administrator))
{
return true;
}
return false;
}
** 注:このコードは、ユーザーが管理者ではなく、ユーザーが管理者として起動するかどうかを判断します。ユーザーは管理者ですが、アプリケーションを起動するときに、必ずしも管理者モードで起動するとは限りません。ネット検索はユーザーが管理者かどうかを判断し、検索結果のほとんどはこのコードです。**
- 以管理者方式,是最基本的コード,以下:
public static void RunAsAdmin()
{
ProcessStartInfo startInfo = new ProcessStartInfo();
//设置以管理员方式启动标记
startInfo.Verb = "runas";
//使用shell启动进程
startInfo.UseShellExecute = true;
startInfo.FileName = Process.GetCurrentProcess().MainModule.FileName;
Process.Start(startInfo);
}
Note:Verbは管理者として起動されます。Verbの設定に加えて、UseShellExecute=trueを設定してプロセスを起動し、シェルを使用してプロセスを起動しないと、起動時に管理者権限が渡されます。つまり、元のアプリケーションが管理者として起動されていない場合、パスは管理者として起動されず、管理者として起動されます。スタートアップオブジェクトには、読者が自分で調べることができる多くのプロパティもあります。
- 現在UAC(ユーザーアカウント制御)をオンにしているかどうかを判断し、UACをオフにすると、現在のユーザーが管理者権限を持っていることを示します。
public static bool IsUACEnabled()
{
//注册表项
RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System", false);
if (key != null)
{
//获取子键EnableLUA的值,1表示开启了UAC
object value = key.GetValue("EnableLUA");
if (value != null && value.ToString() == "1")
{
return true;
}
}
return false;
}
- 現在のユーザーが管理者権限グループにいるかどうかを確認します。コードは次のとおりです。
public static bool IsInAdminGroup()
{
WindowsIdentity windowsIdentity = WindowsIdentity.GetCurrent();
WindowsPrincipal windowsPrincipal = new WindowsPrincipal(windowsIdentity);
var claims = windowsPrincipal.Claims;
//声明集合中有用户组的信息,S-1-5-32-544代表管理员组
return claims.Any(c => c.Type == "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/denyonlysid" && c.Value == "S-1-5-32-544");
}
- UAC 管理者が権限を昇格させる動作を判断します。ここでは、動作が“プロンプトなし、直接昇格”かどうかを判断する必要があります。コードは次のとおりです。
public static bool IsUpPermissionWithOutTip()
{
//注册表项
RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System", false);
if (key != null)
{
//获取子键ConsentPromptBehaviorAdmin的值,0表示开启了不提示直接提升,就不会造成阻断
object value = key.GetValue("ConsentPromptBehaviorAdmin");
if (value != null && value.ToString() == "0")
{
return true;
}
}
return false;
}
上记は主な流れにより抽出した5つの方法である.実際の開発過程ではまた、管理者モードでの起動失敗後の無制限再起動の問題も検討してください。メソッドは例外を考慮しておらず、ユーザーは独自のニーズに応じて例外処理を行う必要があります。
まとめまとめまとめ
本稿では主に著者の開発経験に基づいて無人での実現方式を整理し,読者は開発過程で実際のニーズに応じて柔軟に組み立てたり,上記にない機能やロジックを追加したりする.著者の関連知識にも盲点や論理的な考えがあるかもしれませんが、歓迎されます。