注:本方法實測支持 VisualSVN 2.1~3.6.x,不過2還需多改Apache的配置,老版本應該拋棄,懶得寫了。
轉載請註明來源,不爲別的,就是怕那些無良網站爲了流量到處轉帖,轉丟失內容或者是老版本的內容。
如果不用VisualSVN客戶端的話,VisualSVN Server只能在服務器端修改密碼,對管理來說很不方便。
網上大部分給 VisualSVN 增加自助修改密碼的補丁都是基於 2.5.x 版本的,也有幾個用於 3.5.x/3.6.x 版本,多數還是用 cgi 方式,而且要麼像 csdn 那樣藏着掖着,要麼也沒個詳細的說明。
VisualSVN Server 帳號及密碼保存在 htpasswd 文件裏,除了 cgi 有以下幾種修改方式:
1、使用 VisualSVN Server Manager 管理工具重置密碼。
2、通過 WMI 裏用 PowerShell 腳本更改。示例如下:
$svnuser = Get-WmiObject -Namespace Root\VisualSVN ` -ComputerName svn.hostname.com ` -query "select * from VisualSVN_User where name = 'username'" $svnuser.SetPassword('123456') |
3、使用 Windows 版 Apache 的 htpasswd.exe 命令更改。
該方法是使用 php 頁面來調用 htpasswd.exe 修改密碼,方便用戶通過網頁修改,下面講解配置要點。
我使用的操作系統是 Windows Server 2008R2 x64,安裝了 VisualSVN Server 3.5.6 x64 帶 Apache 2.2.31 x64 的版本,默認安裝路徑。
從 Apache 官方網站下載完整的 Apache 2.2.31 x64 版本,從裏面提取一個文件 htpasswd.exe 放到
C:\Program Files\VisualSVN Server\bin\htpasswd.exe |
Apache 2.2.x 要以 handler 方式加載 php 模塊,只有 php 5.2-5.4 的 Thread Safe 版本才帶 php5apache2_2.dll 文件,php 5.5 及之後的版本只能和 Apache 2.4.x 搭配了,所以選定 php 5.4 版本。
特別注意,如果用 VisualSVN Server x64 就必須找 x64 的 php!
否則 Apache 加載 php 模塊會提示錯誤 Cannot load php5apache2_2.dll into server
因爲 Apache x64 無法使用 php x86。
使用 32 位版本的 VisualSVN Server 比較簡單,因爲 php 官網都是 x86 版本:
使用 64 位版本的 VisualSVN Server 就得找第三方編譯的 php x64 版本了,提供兩個下載:
我下載的是 php-5.4.36-Win32-VC9-x64.zip,下載後解壓到 C:\Program Files\VisualSVN Server\php 文件夾。把 php.ini-production 文件重命名爲 php.ini 即可,其他不用配置。
修改空文件 C:\Program Files\VisualSVN Server\conf\httpd-custom.conf
內容如下:
LoadModule php5_module "php/php5apache2_2.dll" <IfModule php5_module> AddType application/x-httpd-php .php DirectoryIndex index.html index.php </IfModule> # 配置 php.ini 的路徑 PHPIniDir "php" |
新建一個 php 文件放到 C:\Program Files\VisualSVN Server\htdocs\pw\index.php
內容如下(做了一點小修改,增加返回及跳轉頁面的處理):
<?php $username = $_SERVER["PHP_AUTH_USER"]; //經過 AuthType Basic 認證的用戶名 $authed_pass = $_SERVER["PHP_AUTH_PW"]; //經過 AuthType Basic 認證的密碼 $input_oldpass = (isset($_REQUEST["oldpass"]) ? $_REQUEST["oldpass"] : ""); //從界面上輸入的原密碼 $newpass = (isset($_REQUEST["newpass"]) ? $_REQUEST["newpass"] : ""); //界面上輸入的新密碼 $repeatpass = (isset($_REQUEST["repeatpass"]) ? $_REQUEST["repeatpass"] : ""); //界面上輸入的重複密碼 $action = (isset($_REQUEST["action"]) ? $_REQUEST["action"] : ""); //以hide方式提交到服務器的action if ($action!="modify") { $action = "view"; } else if ($authed_pass!=$input_oldpass) { $action = "oldpasswrong"; } else if (empty($newpass)) { $action = "passempty"; } else if ($newpass!=$repeatpass) { $action = "passnotsame"; } else{ $action = "modify"; } ?> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GBK"> <title>Subversion 在線自助密碼修改</title> </head> <body> <?php //action=view 顯示普通的輸入信息 if ($action == "view") { ?> <script language = "javaScript"> <!-- function loginIn(myform) { var newpass=myform.newpass.value; var repeatpass=myform.repeatpass.value; if (newpass=="") { alert("請輸入密碼!"); return false; } if (repeatpass=="") { alert("請重複輸入密碼!"); return false; } if (newpass!=repeatpass) { alert("兩次輸入密碼不一致,請重新輸入!"); return false; } return true; } //--> </script> <style type="text/css"> <!-- table { border: 1px solid #CCCCCC; background-color: #f9f9f9; text-align: center; vertical-align: middle; font-size: 9pt; line-height: 15px; } th { font-weight: bold; line-height: 20px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-bottom-style: solid; color: #333333; background-color: f6f6f6; } input{ height: 18px; } .button { height: 20px; } --> </style> <br><br><br> <form method="post"> <input type="hidden" name="action" value="modify"/> <table width="220" cellpadding="3" cellspacing="8" align="center"> <tr> <th colspan=2>Subversion 密碼修改</th> </tr> <tr> <td>用 戶 名:</td> <td align="left"> <?php echo $username?></td> </tr> <tr> <td>原 密 碼:</td> <td><input type=password size=12 name=oldpass></td> </tr> <tr> <td>用戶密碼:</td> <td><input type=password size=12 name=newpass></td> </tr> <tr> <td>確認密碼:</td> <td><input type=password size=12 name=repeatpass></td> </tr> <tr> <td colspan=2> <input onclick="return loginIn(this.form)" class="button" type=submit value="修 改"> <input name="reset" type=reset class="button" value="取 消"> <input onclick="window.location.href='/'" class="button" type="button" value="返 回"> </td> </tr> </table> </form> <?php } else if ($action == "oldpasswrong") { $msg="原密碼錯誤"; } else if ($action == "passempty") { $msg="請輸入新密碼"; } else if ($action == "passnotsame") { $msg="兩次輸入密碼不一致,請重新輸入"; } else { $passwdfile="D:\Repositories\htpasswd"; $command='"C:\Program Files\VisualSVN Server\bin\htpasswd.exe" -b '.$passwdfile." ".$username.' "'.$newpass.'"'; system($command, $result); if ($result==0) { $msg_succ="用戶[".$username."]密碼修改成功,請用新密碼登陸"; } else { $msg="用戶[".$username."]密碼修改失敗,返回值爲".$result.",請和管理員聯繫"; } } if (isset($msg_succ)) { ?> <script language="javaScript"> <!-- alert("<?php echo $msg_succ?>"); window.location.href="/" //--> </script> <?php } else if (isset($msg)) { ?> <script language="javaScript"> <!-- alert("<?php echo $msg?>"); window.location.href="<?php echo $_SERVER["PHP_SELF"]?>" //--> </script> <?php } ?> </body> </html> |
在header增加超鏈接麻煩,所以我就在頁腳增加修改密碼的鏈接,
修改文件 C:\Program Files\VisualSVN Server\WebUI\index.html
內容如下:
完工。
效果圖如下: