3

私はここにあるコードを基本的にそのまま使用してプロセスを開始しています。このコードはVista/7で問題なく動作します-を使用してプロセスを開始すると、プロセスSystem.Diagnostics.Process.Start()が開始されていることがわかりますが、セッション0にあるため表示されません。このコードを使用すると、プロセスがセッション1(同じセッション)で開始されていることがわかります。 Vista / 7で手動でプログラムを起動します)。

現在、Server 2008では、プログラムを手動で開始すると、セッション2が開きます。このコードを使用しない場合でも、プロセスはセッション0から始まります。このコードを使用すると、セッション1から始まります。しかし、見えません。おそらくこれは、私と同じセッションで開始されていないため、他の場所の「非表示」デスクトップに存在しているためです。

誰かが以前にこの問題に遭遇したことがありますか?ブログは比較的人気があるように思われるので、この問題がまだ解決されていないと私は信じがたいです。私が取り組んでいるサーバーは64ビットアーキテクチャで、Win7マシンは32ビットです。それでも違いはないと思いますが、ブログには、ソリューションが両方のアーキテクチャで機能することが示されています。

4

1 に答える 1

1

リモートデスクトップを介してUACをバイパスしようとしている場合は、IDオーバーライドを使用する必要があります。WTSGetActiveConsoleSessionIdこれは、リモートデスクトップを使用するときにMicrosoftAPIメソッドが正しい情報を提供できないためです。

物理コンソールに接続されているセッションのセッションID。

したがって、Vista / Win7 / 2k8 UACをバイパスするには、基本的なPing機能を使用できます。これにより、ユーザーが表示できる正しいSIDを使用してローカルシステムでプロセスが開始されます。

これが発生していないことに気付いた場合は、プロセスマネージャに移動し、SIDを検査し、pingw/を使用userIDOverrideして正しいSIDを指定できます。

private static readonly ILog Logger
    = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

String applicationName = String.Empty;
bool result; 

public Access()
{
    Logger.Debug("I am now in Access Constructor");
}

public void Ping(string address)
{
    Logger.Debug("I am now in Ping");

    applicationName = @"C:\Windows\System32\ping.exe " + address + " -t";
    Logger.Debug(String.Format("Application Name: {0} ", applicationName));

    ApplicationLoader.PROCESS_INFORMATION procInfo;
    result = ApplicationLoader.StartProcessAndBypassUAC(
        applicationName,
        out procInfo,
        null);

    Logger.Debug(String.Format(
        "Result of StartProcessAndBypassUAC: {0} ", result.ToString()));
}

public void Ping(string address, int userIDOverride)
{
    Logger.Debug("I am now in Ping w/ override");

    applicationName = @"C:\Windows\System32\ping.exe " + address + " -t";
    Logger.Debug(String.Format("Application Name: {0} ", applicationName));

    ApplicationLoader.PROCESS_INFORMATION procInfo;
    result = ApplicationLoader.StartProcessAndBypassUAC(
        applicationName,
        out procInfo,
        userIDOverride);

    Logger.Debug(String.Format(
        "Result of StartProcessAndBypassUAC: {0} ", result.ToString()));
}
于 2013-10-08T16:16:12.177 に答える