2012-12-30 1 views
1

웹 서버 (Windows 2008R2, IIS)에서 직접 실행하면 Powershell 스크립트가 성공적으로 완료됩니다. PHP 페이지에서 스크립트를 시작하려고합니다. 스크립트가 시작되고 작업 관리자의 프로세스가 잘 보입니다. 나는 PHP 페이지에서 shell_exec를 사용하여 스크립트를 호출 할 때shell_exec를 사용하여 관리자 사용자 이름 및 암호를 전달하십시오.

는, 내가 스크립트가 사용자 IUSR로 실행되는 작업 관리자에서 볼 수있는 오류

"Exception calling "FindOne" with "0" argument(s): "An operations error occurred." 

실패합니다. 나는 이것이 스크립트가 실패하고있는 이유라고 확신한다. 성공적으로 완료하려면 도메인 관리자로 실행해야한다.

나는 현재 페이지에 로그인 한 사용자 $ 사용자 이름 = (AD에 대해 인증)

다음 명령
$ newPword1 = 새 사용자 암호

$query = shell_exec("powershell -command $psScriptPath '$username' '$newPword1' < NUL"); 

파워 쉘 스크립트와 스크립트를 호출하고 :

#*============================================================================= 
#* PARAMETER DECLARATION 
#*============================================================================= 

param([string]$username,[string]$pword) 

#*============================================================================= 
#* INITIALISE VARIABLES 
#*============================================================================= 
# Increase buffer width/height to avoid Powershell from wrapping the text before 
# sending it back to PHP (this results in weird spaces). 
$pshost = Get-Host 
$pswindow = $pshost.ui.rawui 
$newsize = $pswindow.buffersize 
$newsize.height = 3000 
$newsize.width = 400 
$pswindow.buffersize = $newsize 


#*============================================================================= 
#* SCRIPT BODY 
#*============================================================================= 

$root = [ADSI]'LDAP://<server>/<DNtoOU>' 
$searcher = new-object System.DirectoryServices.DirectorySearcher($root) 
$searcher.filter = "(&(objectCategory=person)(sAMAccountName=$username))" 
$user = $searcher.findone() 

$userDN = $user.path 

$user=[ADSI]$($userDN) 
$user.SetPassword($pword) 
$user.setinfo() 
write-host "success" 

도메인 관리자 사용자 이름/암호를 전달하여 powershell을 실행할 수 있습니까? bove 명령을 사용하여 스크립트를 성공적으로 실행할 수 있습니까?

+0

내 웹 사이트 (theboywonder.co.uk)에서이 스 니펫을 얻었습니까? 왜 기본 인증을 사용하여 웹 사이트에 로그인하지 않습니까? IIS에 도메인 관리자 자격 증명으로 로그인하면 로그온 한 사용자로 PowerShell이 ​​시작됩니다. 이 방법으로 도메인 관리자 자격 증명을 사용하는 데 사용 권한 문제가 없었습니다. 어쨌든 내 전체 (긴) 가이드를 따르고 싶다면, 어떻게 보여줄 것인가. – Robin

답변

1

여러 가지 방법 중 하나는 PowerShellRunAs을 사용하는 것입니다.

편집 : 그것은 설명되어, 당신은있는 그대로 PowerShell 스크립트를 사용하거나 사용자의 요구 (암호 파일을 사용하여 예를 들어, 하지)에 따라 수정할 수 있습니다. 대신 더 상세하게

:
shell_exec("powershell -command "Start-Process powershell.exe -argumentlist '-command $psScriptPath …' -Credential 'TheDomain\TheUser'")
그러나 암호 프롬프트를 피하기 위해, 문서에 따라 PowerShellRunAs 사용 :
shell_exec("powershell -command $psScriptPath …")
당신이 사용할 수있는 다른 방법
shell_exec("powershell -command "Start-Process powershell.exe -argumentlist '-command $psScriptPath …' -Credential (.\PowerShellRunAs.ps1 -get contoso\svc_remoterestart \\fileserver\share\file.pwd)")

을, start-process … -credential …을 자신의 스크립트에 통합 할 수 있습니다. 그렇게하면 이전과 같이 shell_exec 호출을 간단하게 유지할 수 있으며 스크립트의 일부만 다른 (더 높은) 권한을 가진 사용자로 실행됩니다.

스크립트를 그대로 사용해야하는 경우 -get 대신 -set으로 먼저 실행하여 암호 파일을 설정해야합니다.

+0

아이디어를 구현하는 방법은 무엇입니까? – ChrisM

+0

관리자 자격 증명을 저장하는 암호 파일로 작동하지 않는 것은이 파일을 만든 사용자 만 액세스 할 수 있습니다 ... "여러 가지 방법 중 하나"라고 언급했는데 다른 것들에 대해 조언 할 수 있습니까? – ChrisM