Windows | Сценарий Active Directory | Переполнение стека

У меня есть приложение PHP, которое вносит изменения в активный каталог. Теперь у меня есть скрипт powershell, посмотрите ниже ($ username пропускается через php):

Disable-ADAccount -Identity $username

Если я запускаю этот скрипт через командную строку, boom работает нормально. Однако, если я запускаю его через PHP (cgi), он не работает и изменения не вносятся, также нет ошибок в браузере.

Так что после многих проб и ошибок я обнаружил, что ЧТЕНИЕ из активного каталога прекрасно работает с php, например, с таким сценарием:

Get-ADUser $username -Properties GivenName

Однако ПИСЬМО в активный каталог, такой как первый упомянутый скрипт, не работает.

Мне удалось просмотреть логи Apache и найти эту полезную информацию:

Disable-ADAccount : Insufficient access rights to perform the operation
At C:\scripts\lock.ps1:4 char:1
+ Disable-ADAccount -Identity $username
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : NotSpecified: (12PotterH:ADAccount) [Disable-ADA
ccount], ADException
+ FullyQualifiedErrorId : ActiveDirectoryServer:8344,Microsoft.ActiveDirec
tory.Management.Commands.DisableADAccount

Как я могу преодолеть это?

Что следует отметить:
— Я использую Windows Server 2012

  • Я дал полные права доступа к папкам php-cgi, powershell, cmd, xampp

  • Я использую xampp (apache)

  • Активный каталог находится на ДРУГОМ локальном сервере, а не на xampp

Я также попытался добавить параметр сервера в скрипт так:

Disable-ADAccount -Identity $username - Server SERVERNAME

0

Решение

Если вы не укажете учетные данные в командлетах powershell, то, скорее всего, вы попытаетесь запустить сценарии в качестве удостоверения пула приложений на сервере, на котором размещен сайт php.

Правильный способ обойти это — указать учетные данные в сценариях powershell. Большинство командлетов AD имеют параметр -credential, который вы можете использовать.

Вот пример:

$Username = 'domain\username'
$Password = 'Password123'
$pass = ConvertTo-SecureString -AsPlainText $Password -Force
$Cred = New-Object System.Management.Automation.PSCredential -ArgumentList $Username,$pass
Get-ADUser $SamAccountName -Credential $Cred

Изменить: версия с использованием учетных данных, предоставленных в виде открытого текста

1

Другие решения

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

Еще одним вариантом будет обеспечение того, что сервис / приложение. Учетная запись пула имеет соответствующий доступ в Active Directory. Если это будет происходить подобным образом, я настоятельно рекомендую убедиться, что это другая учетная запись, отличная от остальных идентификаторов пула приложений, и, вероятно, также отделенная от других сайтов.

0