web-dev-qa-db-ja.com

管理者として実行:requireAdministrator&ClickOnce +システム時刻のエミュレート

私のアプリはClickOnce技術を使用しています。今日は管理者として実行する必要がありました。マニフェストファイルをから変更しました

<requestedExecutionLevel  level="asInvoker" uiAccess="false" />

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

ただし、VSはプロジェクトをコンパイルできません。

エラー35ClickOnceは、要求実行レベル「requireAdministrator」をサポートしていません。

一度に使うのは無理だと思います。そうですね。システム時刻を変更する必要がありますが、アプリケーションレベルで変更できますか?エミュレートできますか、アプリです。私がやりたいことができます。時間を+2時間変更してから、1秒間戻します。私はいくつかのdllを手に入れました、そして彼らは時間を求めます。

14
Nime Cloud

時間はシステム全体のものであり、プロセスのためだけに変更することはできません。依存関係に嘘をつく唯一の方法は、Detoursなどを使用してAPIをフックすることです。ユーザーアカウントが少ない場合は許可されません。

時刻を変更するには、「システム時刻の変更」または「タイムゾーンの変更」権限(通常は管理者アカウントが付与されます)が必要です。

また、@ Chrisが述べたように、adminとClickOnceには互換性がありません。

7
devstuff

実際には、管理者権限でClickOnceアプリケーションを実行することはできませんが、少しハックがあります。管理者権限で新しいプロセスを開始できます。 App_Startupの場合:

if (!IsRunAsAdministrator())
{
  var processInfo = new ProcessStartInfo(Assembly.GetExecutingAssembly().CodeBase);

  // The following properties run the new process as administrator
  processInfo.UseShellExecute = true;
  processInfo.Verb = "runas";

  // Start the new process
  try
  {
    Process.Start(processInfo);
  }
  catch (Exception)
  {
    // The user did not allow the application to run as administrator
    MessageBox.Show("Sorry, this application must be run as Administrator.");
  }

  // Shut down the current process
  Application.Current.Shutdown();
}

private bool IsRunAsAdministrator()
{
  var wi = WindowsIdentity.GetCurrent();
  var wp = new WindowsPrincipal(wi);

  return wp.IsInRole(WindowsBuiltInRole.Administrator);
}

記事全文を読む

ただし、よりネイティブで簡単なソリューションが必要な場合は、ユーザーに管理者としてInternet Explorerを実行するように依頼するだけで、ClickOnceツールも管理者権限で実行されます。

25
Olexii

正解-ClickOnceは管理者権限で操作できません。実際、そうしないように設計されています。

5
Chris Rogers
   private void Form1_Load(object sender, EventArgs e)
    {
        if (WindowsIdentity.GetCurrent().Owner == WindowsIdentity.GetCurrent().User)   // Check for Admin privileges   
        {
            try
            {
                this.Visible = false;
                ProcessStartInfo info = new ProcessStartInfo(Application.ExecutablePath); // my own .exe
                info.UseShellExecute = true;
                info.Verb = "runas";   // invoke UAC Prompt
                Process.Start(info);
            }
            catch (Win32Exception ex)
            {
                if (ex.NativeErrorCode == 1223) //The operation was canceled by the user.
                {
                    MessageBox.Show("Why did you not selected Yes?");
                    Application.Exit();
                }
                else
                    throw new Exception("Something went wrong :-(");
            }
            Application.Exit();
        }
        else
        {
            //    MessageBox.Show("I have admin privileges :-)");
        }
    }
4
Sven Gurke

IEからClickOnceアプリを起動する場合、管理者権限を取得するには、管理者権限でIEを実行するだけで、アプリにも管理者権限が付与されます。

2
Olexii

私のアプリはレジストリにアクセスするため、管理者権限が必要なため、プロジェクトのプロパティ/セキュリティタブが完全な権限に設定されています。 Clickonceアプリをネットワークドライブにデプロイします。 ClickOnce "setup.exe"を管理者として実行して、アプリをインストールすることしかできません。ただし、インストール後にアプリを実行できません。アプリを管理者として実行することはできませんが、setup.exeに戻って管理者として再度実行すると、アプリが既にインストールされているため、アプリが実行されます。 Win 10互換性ウィザードを実行して、アプリを常に昇格されたアクセス許可で実行するように設定しても機能しません。常に右クリックして、ネットワークドライブから管理者としてsetup.exeを実行する必要があることをユーザーに伝えるのは好きではありません。結局、私はclickonceアプリを「デプロイ」しません。ネットワークドライブにビルドするだけで、ユーザーがアプリのexeを実行します。その後、互換性ウィザードを使用して、常に管理者として実行できます。

0
SteveB