Запуск кода powershell в программе python в контейнере docker
На сервере linux имеется 3 контейнера docker (postgres, python app, python app), основанные на образах python:3.10.9-slim-buster, postgres:latest. К ним необходимо добавить еще один контейнер, содержащий приложение python. Проблема в том, что это приложение использует команды powershell для получения информации из ActiveDirectory.
Функция для запуска команд powershell:
def execute(powershell_script):
args = ['powershell.exe', powershell_script]
p = subprocess.Popen(args, stdout=subprocess.PIPE)
result = p.communicate()[0]
return result
И в дальнейшем команда запускается:
command = f"$host.UI.RawUI.BufferSize = New-Object System.Management.Automation.Host.Size(8192,500);" \
f"get-aduser -filter * -properties PasswordNeverExpires " \
f"| Where {{$_.passwordNeverExpires -eq 'true' -and $_.enabled -eq 'true'}} " \
f"| Select-Object DistinguishedName, SamAccountName | Format-Table -AutoSize"
res = execute(command)
Это приложение мне нужно запустить в контейнере, но я не понимаю как это сделать.
Первый вариант - запустить контейнер на образе windows, но объем образа очень большой и я не уверен что можно запускать одновременно linux и windows контейнеры. Второй вариант - запустить контейнер на том же образе python с установленным pwsh. Но на текущий момент мне не удается подключить модуль activedirectory:
The term 'get-aduser' is not recognized as a name of a cmdlet, function, script file, or executable program
Как этот вопрос решается?
Ответы (1 шт):
Из представленной информации я предполагаю что вам нужен инструмент который позволит общаться с AD доменом. Сейчас для этого вы используете команды powershell внутри linux контейнера, что является в корне неправильным подходом. Используя python вам стоит обратить внимание на различные библиотеки для взаимодействия с AD доменом. Например, в коде вы используете команду get-aduser, и я нашёл на просторах интернета такое решение которое использует библиотеку python-ldap.
user_filter = '(sAMAccountName={})'.format(search_username)
base_dn = 'DC={},DC=com'.format(domain)
result = connection.search_s(base_dn, ldap.SCOPE_SUBTREE, user_filter)
print result
P.s - судя по виду кода используется python2.
В любом случае я думаю что вам придётся самостоятельно декомпозировать задачу и искать ответы на многие вопросы, пока что вопрос слишком общий.