В обход изоляции сеанса 0 в Windows Server 2008 - успешно, но все еще не видно - PullRequest
3 голосов
/ 04 апреля 2011

Я использую код, расположенный здесь , в основном, как есть, чтобы начать процесс. Этот код работает безупречно в Vista / 7 - если я запускаю процесс, используя System.Diagnostics.Process.Start(), я вижу, что он запускается, но не виден, потому что он находится в сеансе 0. Используя этот код, я вижу запуск процесса в сеансе 1 ( в том же сеансе я запускаю программы вручную в Vista / 7).

Теперь, в Server 2008, когда я запускаю программу вручную, она открывается в Сессию 2. Когда я не использую этот код, я вижу, что процесс все еще запускается в Сессию 0. Когда я использую этот код, он запускается в Сессию 1 - но не видно. Предположительно, это потому, что он не запущен в том же сеансе, что и я, и, следовательно, существует на «невидимом» рабочем столе в другом месте.

Кто-нибудь сталкивался с этой проблемой раньше? Блог кажется относительно популярным, поэтому мне трудно поверить, что этот вопрос еще не решен. Сервер, на котором я работаю, имеет 64-битную архитектуру, моя машина win 7 - 32-битная. Я не думаю, что это имеет значение, хотя блог указывает, что решение работает на обеих архитектурах.

1 Ответ

1 голос
/ 08 октября 2013

Вам потребуется использовать переопределение идентификатора, если вы пытаетесь обойти UAC через удаленный рабочий стол. Причина этого заключается в том, что метод Microsoft API WTSGetActiveConsoleSessionId не может предоставить правильную информацию при использовании удаленного рабочего стола:

Идентификатор сеанса, который подключен к физической консоли.

Итак, чтобы обойти UAC Vista / Win7 / 2k8, вы можете просто использовать базовую функцию Ping - она ​​запустит процесс в ЛОКАЛЬНОЙ СИСТЕМЕ с правильным SID, видимым пользователем.

Если вы заметили, что этого не происходит, вы можете зайти в диспетчер процессов, проверить SID и использовать ping w / 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()));
}
...