Windows サービスを変更するアプリケーションを作成しています。ただし、何らかの理由で、管理者が必要なため、「cs config SERVICE_NAME set= SETTING」を実行したり、レジストリを変更してサービスのスタートアップ設定を変更したりすることはできません。すでに管理者アカウントで完全な管理者アクセスを許可しています。
私が何をしても、レジストリにアクセスできないというエラーが常に表示されるか、権限がないためにCMDで設定されません。行き詰まる特定のサービスは、「DCOM Server Process Launcher」と呼ばれます
アプリのマニフェストのセキュリティ設定は次のとおりです
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
</requestedPrivileges>
<applicationRequestMinimum>
<defaultAssemblyRequest permissionSetReference="Custom" />
<PermissionSet ID="Custom" SameSite="site" />
</applicationRequestMinimum>
</security>
</trustInfo>
これにより、プログラムの起動時に管理者権限が付与されます。ファイルを手動で右クリックして「管理者として実行」を選択しても、まだ機能しません。
レジストリに入るには、これがコードで、CMD プロセスも含まれています。
RegistryKey key = null;
key = Registry.LocalMachine.OpenSubKey("SYSTEM\\CurrentControlSet\\Services\\" + service, true); //true should make it Read/Write??
if (key != null)
{
//cmd.issueCmd("sc config " + service + " start= " + setting); //set a service with CMD
key.SetValue("Start", val, RegistryValueKind.DWord); //set a service with Registry
if (setting.Equals("delayed-auto"))
{
key.SetValue("DelayedAutoStart", 1, RegistryValueKind.DWord); //Add the Delayed-Start Registry if needed
}
}
if (key != null)
{
key.Close();
}
return;
CMD プロセス コードは次のとおりです。
//Create a Hidden CMD Prompt to issue commands
ProcessStartInfo processStartInfo = new ProcessStartInfo();
processStartInfo.RedirectStandardInput = true;
processStartInfo.RedirectStandardOutput = true;
processStartInfo.UseShellExecute = false;
processStartInfo.CreateNoWindow = true;
processStartInfo.FileName = "cmd.exe";
processStartInfo.Verb = "runas"; //should give it admin??
cmd = Process.Start(processStartInfo);