Вопрос или проблема
Я запускаю сервер сборки на 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".
Причины ошибки
-
Ограничения учетных записей: Как вы отметили, учетная запись LocalSystem (или LocalService), обладая доступом к локальным ресурсам, сталкивается с ограничениями при попытке запустить процессы с другими учетными данными. Это связано с тем, что LocalSystem не может передавать свои права доступа для выполнения действий в контексте других учетных записей.
-
Безопасность: 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. Выбор подхода зависит от контекста вашей задачи и требований безопасности вашей среды.
Если у вас возникнут дополнительные вопросы или потребуется дальнейшая помощь, не стесняйтесь задавать их.