在Windows上从PHP更新Subversion - 权限相关(拒绝访问)

时间:2011-09-30 13:24:10

标签: php svn iis windows-server-2008

我编写了一个更新SVN工作副本的PHP脚本。

它在我的开发机器(W2k3服务器)上工作正常,但我不能让它在生产服务器(W2k8服务器)上工作。我正在使用最新的Collabnet Subversion二进制文件(1.6.17)。

这是PHP代码:

$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>';

当我从命令提示符运行相同的命令时,它工作正常。但是当我通过IIS运行它时,我得到:

  

svn:无法打开文件'C:\ inetpub \ wwwroot \ mysite.svn \ lock':访问被拒绝。

据推测,我需要提升权限,但我不知道如何实现它。

我已经尝试让_IUSR帐户完全控制包含svn和C:\ inetpub \ wwwroot \ mysite.svn \文件夹的文件夹,但它没有任何区别。

由于

4 个答案:

答案 0 :(得分:2)

  • 帐户IUSR_COMPUTERNAME必须具有文件夹C:\inetpub\wwwroot\mysite.svn的读/写权限(如果是结帐)。
  • 下一步(不确定),您可能需要为虚拟文件夹C:\inetpub\wwwroot\mysite.svn提供对IIS属性中文件夹的写入权限。

答案 1 :(得分:2)

与SVN和Windows Server 2008有同样的问题。问题是由UAC引起的,如果他们不拥有该文件,通常会阻止某人更改文件。在SVN的情况下,问题通常是一个用户执行初始结账,创建.svn文件夹和相关位。然后,另一个用户转到svn up并获得有关修改SVN数据库文件的操作系统级访问问题。

不幸的是,我们可以获得的最佳解决方案是禁用UAC。实际上解决了一些其他问题,它在服务器上确实有意义。如果它作为计划任务运行,那么您可以尝试“以最高权限运行”,但提升那么多对Web应用程序没什么意义。

答案 2 :(得分:1)

我认为你需要专门授予运行PHP的用户的读/写权限。在我的情况下,php作为Apache模块运行,因此它在同一帐户下运行。我不熟悉你的设置,但基本的想法是一样的。一旦确定了运行PHP的帐户,授予它对锁定文件的写入权限,您的问题就会消失。

我不建议在生产服务器上禁用UAC !!永远!!! 您希望为最少数量的用户授予最少量的权限,以获得所需的最少资源。

请勿删除所有用户帐户安全性以写入锁定文件!!! 而是授予单一权限写入权限。没有完全控制。将其授予需要它的单个用户(可能是本地系统帐户)。将其授予需要写入的特定文件(C:\ inetpub \ wwwroot \ mysite.svn \ lock)。

这种做法可以防止恶意利用这个漏洞!

答案 3 :(得分:0)

谢谢大家。最后所有这些答案都有所帮助。

我需要做几件事:

  • 执行svn清理

  • 如果在设置权限时拒绝访问,则转为UAC

  • 顶级.svn文件夹需要IIS_IUSR的写权限

  • 所有.svn文件夹都需要Users组的读/写权限。 但是,没有明显的方法可以执行此操作,因此需要设置权限 在整个网站目录上。

之后,PHP脚本能够执行svn update命令。呼!