2011-09-30 2 views
2

SVN 작업 복사본을 업데이트하는 PHP 스크립트를 작성했습니다.Windows에서 PHP에서 Subversion 업데이트 - 권한 관련 (액세스가 거부 됨)

내 개발 컴퓨터 (W2k3 서버)에서 제대로 작동하지만 프로덕션 서버 (W2k8 서버)에서 작동하지 않습니다. 나는 최신 Collabnet Subversion 바이너리 (1.6.17)를 사용하고 있습니다.

$command = 'svn update C:\inetpub\wwwroot\mysite --config-dir C:\Windows\Temp'; 

$response = array(); 
$handle = popen("$command 2>&1", 'r'); 
$read = ''; 
while($read = fread($handle, 20096)) 
{ 
    $response[] = $read; 
} 
pclose($handle); 
flush(); 

echo '<h2>Command</h2><p> ' . $command . '</p>'; 
echo '<h2>Response</h2><p>' . implode('<br />', $response) . '</p>'; 

내가 명령에서 같은 명령을 실행

가 잘 작동 프롬프트 :

다음은 PHP 코드입니다. 그러나 IIS를 통해 실행하면 다음과 같이 표시됩니다.

svn : 'C : \ inetpub \ wwwroot \ mysite.svn \ lock'파일을 열 수 없습니다. 액세스가 거부되었습니다.

아마도 권한 상승이 필요하지만이를 구현하는 방법을 모릅니다.

나는 svn과 C : \ inetpub \ wwwroot \ mysite.svn \ 폴더가 포함 된 폴더에 대해 _IUSR 계정에 대한 모든 권한을 부여하려고했지만 아무런 차이가 없습니다.

덕분에

+0

'폴더의 모든 권한 '이 재귀 적으로 또는 아닌지? IIS/PHP 사용자/그룹의 발견을 위해'C : \ inetpub \ wwwroot \ mysite.svn \ lock' 파일과'whoami' 파일을 누가 소유하고 있는지 확인할 수 있습니까? –

+0

명령 프롬프트에서 동일한 명령을 실행하면 제대로 작동한다고합니다. IIS ID로 또는 자신으로 실행하고 있습니까? – AlG

답변

2

이 문제는 SVN 및 Windows Server 2008에서 발생했습니다.이 문제는 파일을 소유하지 않은 사용자가 일반적으로 파일을 변경하지 못하게하는 UAC 내용 때문에 발생합니다. SVN의 경우 일반적으로 한 사용자가 .svn 폴더 및 관련 비트를 생성하여 초기 체크 아웃을 수행했습니다. 그런 다음 다른 사용자가 svn up으로 갔고 SVN 데이터베이스 파일 수정에 대한 OS 수준 액세스 문제가 발생했습니다.

불행히도 우리가 얻을 수있는 최선의 해결책은 UAC를 사용 중지하는 것입니다. 사실 몇 가지 다른 문제를 해결했으며 서버에서 실제로 의미가 있습니다. 예약 된 작업으로 실행중인 경우 "가장 높은 권한으로 실행"을 시도 할 수 있지만 그만큼 높게 설정하면 웹 응용 프로그램에 거의 적합하지 않습니다.

+0

제작 상자에서이 작업을 수행하지 마십시오! UAC는 Windows 시스템의 보안 핵심입니다. 때로는 불편할 수 있지만 안전한 서버의 경우 세밀한 권한을 갖는 것이 매우 중요합니다. 그리고 Full Control은 유닉스 박스에서 777과 동일하다는 것을 기억하십시오! 자신의 이익을 위해 서버의 레벨을 수정하기위한 권한을 설정하는 시간을 가져주십시오! –

+0

UAC를 사용하지 않도록 설정하고 모든 사람에게 모든 권한을 부여하는 것은 큰 차이가 있습니다. UAC는 실제로 다른 사람의 파일에 쓸 일이 없어야하지만 서버에 몇 가지 문제가있는 사용자 지향적 인 작업을 의미합니다. 이 같은. –

+0

나는 그 구별을하기 위해 실패했다. 네가 나를 오해하면 미안해. 나는 그의 전체 SVN 폴더에 대해 인터넷 사용자 계정에 모든 권한을 부여했다는 질문의 일부를 언급했다. 질문자가 가장 작고 잠재적으로 위험한 변화를 최소화하도록 격려하기 위해 노력했습니다. 그런 다음 문제가 해결되지 않으면 한 번에 하나씩 사용 권한을 추가하십시오. 다른 말로하면 날아 다니기 위해 쇠 망치를 사용하지 마십시오. –

2
  • 계정이 체크 아웃 경우 IUSR_COMPUTERNAME 폴더 C:\inetpub\wwwroot\mysite.svn에 대한 읽기/쓰기 액세스 권한이 있어야합니다.
  • 다음 (확실하지 않음) 가상 폴더 C:\inetpub\wwwroot\mysite.svn에 대한의 IIS 속성 폴더에 대한 쓰기 권한을 에게 부여해야 할 수 있습니다.
1

PHP가 실행되는 사용자에게 읽기/쓰기 권한을 부여해야한다고 생각합니다. 필자의 경우 php는 Apache 모듈로 실행되므로 동일한 계정으로 실행됩니다. 나는 당신의 설정에 익숙하지 않지만 기본적인 생각은 같다. PHP를 실행중인 계정을 결정한 후에는 잠금 파일에 쓰기 권한을 부여하면 문제가 없어집니다.

프로덕션 서버에서 UAC를 사용하지 않도록 설정하지 마십시오! 이제까지!!! 필요한 최소의 리소스로 최소의 사용자 수에 대해 가장 작은 사용 권한을 부여하려고합니다.

잠금 파일에 쓰기 위해 모든 사용자 계정 보안을 제거하지 마십시오 !!! 대신 단일 사용 권한 쓰기 권한을 부여하십시오. 완전한 통제가 아닙니다. 로컬 시스템 계정을 필요로하는 단일 사용자에게 권한을 부여하십시오. 쓸 필요가있는 특정 파일 (C : \ inetpub \ wwwroot \ mysite.svn \ lock)에 대해 권한을 부여하십시오.

이 접근법은 악성 코드에 의해 악용 될 수있는 보안 구멍을 열지 못하게합니다.

0

모두에게 감사드립니다. 결국이 모든 대답들이 도움이되었습니다.

나는 몇 가지를 할 필요가 :

  • 권한

  • 최상위 수준을 .svn 폴더 필요한 쓰기를 설정할 때 액세스가 거부되는 경우

  • 는 UAC의 걸까요 SVN 정리를 수행 IIS_IUSR의 사용 권한

  • 모든 .svn 폴더에는 Users gr에 대한 읽기/쓰기 권한이 필요합니다. 웁. 그러나 이렇게하려면 명백한 방법이 없으므로 전체 사이트 디렉터리에 사용 권한을 으로 설정해야합니다.

그 후 PHP 스크립트가 svn update 명령을 수행 할 수있었습니다. 휴!

관련 문제