Не удалось создать процесс с повышенными правами от имени учетной записи LocalSystem.

Вопрос или проблема

Я запускаю сервер сборки на Windows Server 2008 (Team City). Сборки выполняются агентом Team City, который работает как служба Windows под учетной записью LocalService.

Одной из сборок нужно скопировать zip-файл, который она создает, на удаленный ресурс. Для этого у меня есть сценарий PowerShell, который пытается запустить новый процесс с учетными данными пользователя с соответствующими правами для записи на общий ресурс. Проблема в том, что сценарий не может создать процесс. Я могу без проблем запустить сценарий от своего администратора (так что сам сценарий, похоже, в порядке), и это заставляет меня думать, что учетная запись LocalSystem не имеет каких-то прав для запуска новых процессов с другими учетными данными или что-то в этом роде?

Какие-нибудь идеи, что на самом деле означает эта ошибка?
Примечание: Я не вижу никаких ошибок в журналах событий безопасности, что кажется странным(?).

$userName = "domain\user"
$password = "password"
$secstr = New-Object -TypeName System.Security.SecureString
$password.ToCharArray() | ForEach-Object {$secstr.AppendChar($_)}
$credentials = new-object -typename System.Management.Automation.PSCredential -argumentlist $userName, $secstr
$command = "Copy-Item d:\file.zip \\remote\share\file.zip"
$bytes = [System.Text.Encoding]::Unicode.GetBytes($command)
$encodedCommand = [Convert]::ToBase64String($bytes)

Start-Process powershell -NoNewWindow -ArgumentList "-encodedCommand", $encodedCommand -credential $credentials -wait

Ошибка, возникшая на строке Start-Process

System.InvalidOperationException: Эта команда не может быть выполнена из-за ошибки: Доступ запрещен.
    at System.Management.Automation.MshCommandRuntime.ThrowTerminatingError(ErrorRecord errorRecord)

Смотрите мой ответ на Повышение полномочий с помощью PowerShell через учетную запись Local System на StackOverflow:

Кажется, есть ограничение на определенные команды, когда сценарий выполняется под LocalSystem. Это имеет смысл с точки зрения безопасности, учитывая, что LocalSystem:

имеет полный неограниченный доступ к локальным ресурсам. Это также недостаток LocalSystem, поскольку служба LocalSystem может делать вещи, которые могут привести к сбою всей системы.

Ссылка: MSDN, Учетная запись LocalSystem

Ответ или решение

Проблема, с которой вы столкнулись, связана с ограничениями безопасности, наложенными на учетную запись LocalSystem в Windows Server. Давайте рассмотрим ваши трудности более подробно и предложим возможные решения.

Контекст проблемы

Ваша сборочная серверная среда настроена на использование TeamCity, где агент выполняется как служба с использованием учетной записи LocalService. В одном из сборочных процессов требуется скопировать ZIP-архив на удаленный ресурс, однако использование PowerShell для запуска нового процесса с учетными данными пользователя, имеющего необходимые права доступа, приводит к ошибке "Access is denied".

Причины ошибки

  1. Ограничения учетных записей: Как вы отметили, учетная запись LocalSystem (или LocalService), обладая доступом к локальным ресурсам, сталкивается с ограничениями при попытке запустить процессы с другими учетными данными. Это связано с тем, что LocalSystem не может передавать свои права доступа для выполнения действий в контексте других учетных записей.

  2. Безопасность: Windows применяет строгую политику безопасности для ограничения возможности запуска процессов с повышенными правами через LocalSystem. Это предотвращает потенциально опасные действия, которые могут повредить системе.

Опции для решения проблемы

Чтобы корректно скопировать файл на удаленный ресурс, вам может понадобиться рассмотреть несколько подходов:

1. Использование учетной записи с достаточными правами

Попробуйте изменить учетную запись, под которой работает ваш TeamCity агент. Если это возможно, запустите агента под учетной записью, у которой есть необходимые права для доступа к удаленному ресурсу, а не использовать LocalSystem или LocalService. Это позволит избежать ограничений запуска команд с повышенными правами.

2. Изменение настроек доступа

Если изменение учетной записи агента нецелесообразно, вы можете настроить права доступа к удаленному ресурсу так, чтобы учетная запись LocalSystem имела необходимые права на запись. Однако, это менее безопасное решение и должно быть проведено с осторожностью.

3. Дополнительные утилиты для выполнения скрипта

Вместо PowerShell можно использовать сторонние утилиты, такие как PsExec, которые позволяют запускать процессы с заданными учетными данными. Это позволит вам избежать ограничений, налагаемых на LocalSystem:

psexec -u "domain\user" -p "password" powershell.exe -Command "Copy-Item d:\file.zip \\remote\share\file.zip"

4. Запуск как Scheduled Task

В качестве альтернативного варианта можно создать задачу в "Планировщике задач" Windows, которая будет запускаться с учетными данными нужного пользователя. Это позволяет избежать ограничений, налагаемых на LocalSystem, и выполнять задачи с повышенными привилегиями.

Заключение

Проблема, с которой вы столкнулись, иллюстрирует важные аспекты работы с учетными записями Windows и управления безопасностью. Решения, предложенные выше, предоставляют гибкие возможности для обхода ограничений LocalSystem. Выбор подхода зависит от контекста вашей задачи и требований безопасности вашей среды.

Если у вас возникнут дополнительные вопросы или потребуется дальнейшая помощь, не стесняйтесь задавать их.

Оцените материал
Добавить комментарий

Капча загружается...