心's profile真心的家PhotosBlogLists Tools Help

Blog


    June 16

    delphi中用API实现调用打开方式对话框

    procedure TForm1.Button1Click(Sender: TObject);
    var
      r:HINST;
    begin
      OpenDialog1.Execute;//选择文件
      r:=ShellExecute(Handle,'open',PChar(OpenDialog1.FileName),nil,PChar(ExtractFileDir(OpenDialog1.FileName)),SW_SHOW);//打开文件
      if r =SE_ERR_NOASSOC then//如果没有关联的打开方式
        ShellExecute(Handle, 'open', 'Rundll32.exe', PChar('shell32.dll,OpenAs_RunDLL ' + OpenDialog1.Filename), nil, SW_SHOWNORMAL);//调用打开方式对话框
    end;
    May 10

    svn与BugFree用户整合验证失败的解决办法

    在使用MySQL5的时候,如果在Apache的Error.log中出现
    MySQL ERROR: Client does not support authentication protocol requested by server; consider upgrading MySQL client
    信息,需要执行如下SQL语句即可:
    mysql> set password for
        -> 'root'@'localhost'=OLD_PASSWORD('newpass');

    SVN和BugFree的整合(一)……用户整合

    本来想使用trac当做SVN的Issue Trace,但trac还是单项目模式,而且还是使用起来比较不习惯,所以暂时考虑SVN和BugFree的整合,目前两者只是用户名的整合,将来考虑是否整合进trac的形式,在BugFree的项目中直接看到Subversion库里的信息

    使用的版本:
    Windows SP1.5(sp1,后来打的几个补丁)
    Subversion 1.2.0
    BugFree 0.4
    Apache 2.0.54
    mod_auth_mysql.so 2.0.49(apache连接MySQL认证)
    TortoiseSVN 1.2

    SVN的用户管理其实有两个内容,一个是认证:检验用户名,密码是否正确,登录进SVN服务器;第二是权限:针对代码仓库Repository的读写权限分配。

    一,首先按照SVN和Apache整合的文档,使用SVNParentPath方式,这样可以在这个目录下建立多个Repository。
    我的所有操作全部是在本机进行的,有时会使用TortoiseSVN进行客户端的操作,其实完全可以使用SVN的命令行方式。

    1,安装Subversion,apache,TortoiseSVN,建立D:\svntest\parent目录,这里将是SVN所有Repository的根目录,然后在parent目录下,创建a1目录,选中a1,右键菜单,选择TortoiseSVN中的“Create Repository here..”,创建一个基于FSFS的仓库。
    2,修改httpd.conf,添加:
    <Location /parentsvn>
     DAV svn
     SVNParentPath D:/svntest/parent
    </Location>

    3,在浏览器中浏览:http://127.0.0.1/parentsvn/a1/,可以看到正确的信息Revision 0。说明apache,SVN已经整合好了。

    二,利用BugFree的用户认证

    1,首先安装BugFree,保证BugFree能正常运行。其使用的数据库名是bugfree,存放u/p的字段是表buguser里的UserName,UserPassword字段。密码可以用多种方式加密,注意检查include\ConfigBug.inc.php里的$BugConfig["UserTable"]["EncryptType"]是否是md5。

    2,解压mod_auth_mysql.so到apache/modules目录里。注意,mod_auth_mysql不是apache自带的,而是sf的一个项目,主页在http://modauthmysql.sourceforge.net/。目前版本已经到了3.0.0,下载下源码的话,自己需要编译,还需要apache的源码,比较麻烦。 不过已经有人编译好了相应的模块,在http://www.gknw.net/development/apache/httpd-2.0/win32/modules/下载。里面还有2.9.4版本的,但在我的安装中,始终不能正常。所以我只有使用了2.0.49,只是稍微有些设置不一样。

    3,修改httpd.conf里的设置。

    <Location /parentsvn>
     DAV svn
     SVNParentPath D:/svntest/parent
     
     AuthName "MySQL Testing"
     AuthType Basic
     Require valid-user

     AuthMySQLHost localhost
     AuthMySQLUser root
     AuthMySQLPassword xxxxxx

     AuthMySQLDB bugfree
     AuthMySQLUserTable buguser
     AuthMySQLNameField UserName
     AuthMySQLPasswordField UserPassword

     AuthMySQLMD5Passwords On
    </Location>
    </IfModule>

    重启apache,你再次访问http://127.0.0.1/parentsvn/a1/,就弹出认证窗口了,输入用户名admin密码123456,就可以浏览了。

    至此,SVN的用户已经和BugFree的用户整合在一起了。可以在BugFree系统中创建用户,修改密码了。

    下一步需要做的是设置SVN中多用户,多Repository的访问权限控制。

    全文完·非狐外传@2005年8月2日
    May 09

    Subversion使用SSL连接不能列出所有的repository列表的解决办法

     (解决办法,将第二章中所讲在httpd.conf 文件末尾增加的Rewrite 系列语句加至ssl.conf 中的</VirtualHost>  之前就行了。知道为什么了吗?因为之前加的rewrite 语句对 virtualHost 不管用,需要单独另加即可)

    Subversion配置安装教程(三)

        今天来讲讲Subversion的SSL连接。如果没有SSL相关的基础知识,请先自行参阅相关资料。

    首先去http://hunter.campbus.com/ 下载包含openssl模块的apache包,将解压出来的mod_ssl.so 拷贝到Apache的安装路径下的modules目录下,openssl.exe拷贝到bin目录下,conf/ssl.conf拷贝到conf目录下。
    打开拷贝过来ssl.conf,将一下几行加上#注释掉                                                                            DocumentRoot "c:/apache/htdocs"
    ServerName www.example.com:443
    ServerAdmin you@example.com
    ErrorLog logs/error_log
    TransferLog logs/access_log
    把SSLCertificateFile conf/ssl.crt/server.crt改成SSLCertificateFile conf/ssl/my-server.cert
    把SSLCertificateKeyFile conf/ssl.key/server.key改成SSLCertificateKeyFile conf/ssl/my-server.key
    把SSLMutex  file:logs/ssl_mutex改成SSLMutex  default
    删除或者注释这两行<IfDefine SSL>和</IfDefine>
    打开Apache的配置文件http.conf,把其中的#LoadModule ssl_module modules/mod_ssl.so这一行的注释去掉
    下载http://tud.at/programm/openssl.cnf 并保存到bin/openssl.cnf。注意windows会把这个文件显示成一个拨号文件,实际上这是个文本文件,你可以用任何一个文本编辑器打开浏览一下这个文件的内容。实际上这个文件是用来生成证书和公钥的预配置文件。
    在命令行下进入$\program files\apache group\apache2,输入命令:
    bin\openssl req -config bin\openssl.cnf -new -out my-server.csr   
    回答相关问题即可生成一个CSR,也就是一个待签名的证书。本质上说,CSR 就是一个在您的服务器上生成的证书,当您向第三方证书颁发机构申请证书时,它用来验证有关您的服务器的计算机特定信息。实际上,CSR 就是一条用公钥/私钥对加密的文本消息。如图: 
    然后输入命令:
    bin\openssl rsa -in privkey.pem -out my-server.key
    执行成功会生成私匙,如图:
     
         接着输入bin\openssl x509 -in my-server.csr -out my-server.cert -req -signkey my-server.key -days 4000
         这样会生成一个在4000天后过期的用刚刚生成的私匙签名过的x509证书。
         最后输入bin\openssl x509 -in my-server.cert -out my-server.der.crt -outform DER
         这一步是生成了DER格式的证书,对于那些不能识别PEM格式证书的程序,可以使用这种证书。如图:
         
        最后把在$\Apache Group\Apache2目录下生成的my-server.der.crt, my-server.csr, my-server.key, .rnd, privkey.pem, my-server.cert6个文件复制到conf/ssl下,如果ssl这个目录不存在,请先新建这个目录。Ok,大功告成,请在浏览器地址栏输入https://youserver/svn/TestRepository/,看到了什么?呵呵,是不是比较有成就感呢?看看我自己生成的证书:
     
    然后是证书的详细信息:
     
        注意:以上3和4步骤可以不更改,改不改完全都是个人喜好,如果不改,那么在第9个步骤里面相关的命令需要做相应的修改。另外,设置了SSL加密连接以后,通过https://youserver/svn 不会再显示所有的repository列表了,而是显示没有权限访问。而通过http://youserver/svn访问就可以。我怀疑是昨天写的那个php脚本有些问题,没有使用相关的SSL协议访问相关路径,如果有时间我会考虑使用python再次实现。不知道我想的对不对,哪位大侠指教一下?    注意:IIS和Apache的SSL连接会有冲突,具体表现在它们都会尝试使用443作为https协议的端口,我在MS的网站上找到了一篇KB文章,说是改注册表可以关闭ssl服务,我试了一下,似乎不行,在IIS的控制面板里面更改SSL端口选项是灰色不可选,哪位有好的办法?
     

    Subversion配置安装教程(二)

       今天接着昨天的内容讲Subversion的安全配置。在上一讲中我们在Apache的httpd.conf文件里加入了这样一节:
    <Location /svn>
    DAV svn
    SVNParentPath e:\SVN
    AuthType Basic
    AuthName "Subversion repositories"
    AuthUserFile passwd
    #AuthzSVNAccessFile svnaccessfile
    Require valid-user
    </Location> 
        下面我来解释一下这些配置信息用途:
    <Location /svn>
     说明我们所有的代码仓库在/svn这个虚拟目录下
     
    DAV svn
     说明Apache会使用svn这个module来解析这个虚拟目录
     
    SVNParentPath e:\SVN
     说明所有的代码仓库都在本地硬盘的e:\SVN下
     
    AuthType Basic
     使用最基本的认证校验,用户名/密码
     
    AuthName "Subversion repositories"
     说明在认证对话框弹出的时候,对话框的标题显示,你可以把它修改成你想要的任何提示信息,比如:AuthName "Warning"等等
     
    AuthUserFile passwd
     说明我们使用的access list文件的名字,在上一讲中我们建立的文件名字是passwd,所以这里是passwd。如果你建立的文件名字是其他的,这里要作相应的改动
     
    AuthzSVNAccessFile
     说明svn自己控制的access list文件,这个文件很重要,可以丰富svn的安全配置,在下面会讲到
     
    Require valid-user
     说明只有输入正确的用户名/密码才能访问
     

    上述的配置只能是最简单的安全配置,如果你想拥有更强大的安全配置,就需要加入一些东西了。比如:
    如果你想让所有的匿名用户能访问代码仓库,对某些特定用户才开放可写的权限,则需要把 
    Require valid-user
    改成
    <LimitExcept GET PROPFIND OPTIONS REPORT>
    Require valid-user
    </LimitExcept>
    如果你对于代码仓库里面某些目录还有更细致的访问控制,只用passwd就没办法啦,这个时候我们就需要AuthzSVNAccessFile文件了,去掉#AuthzSVNAccessFile svnaccessfile这一行前面的注释。Apache首先会使用passwd校验用户名和密码,然后会认证信息传给Subversion的AuthzSVNAccessFile模块,由这个模块作更进一步的权限控制。首先我们来新建一个文件svnaccessfile,内容如下:
    [groups]
    developers = user1,user2,user3,user4
    docs = user5,user6,user7
    #to allow everyone read access
    [/]
    * = r
    #allow all developers complete access
    @developers = rw
    #give the doc people write access to the docs folder
    [/project/trunk/doc]
    @docs = rw
    首先我们定义了两个group,一个是developer,代表开发组,另外一个是docs,代表文档撰写组,然后
    [/]
    * = r
    意思是对于所有的用户开放可读的权限。注意这里的[/],表示是对根目录下的所有代码仓库赋予权限。接着是
    @developers = rw
    [/project/trunk/doc]
    @docs=rw                                                                                                                                                                                                                                                                  这这里的@应该代表的是group的意思(这个还没有确认,是我自己猜测的,因为如果是直接给单一用户赋予权限,则不需要前面的@,哪位大侠可以证实一下我的猜测?欢迎指教)注意这里对于docs这个组,我们一样指定了目录路径,而不是对于整个代码仓库。
        这里再说说SVNParentPath,配置了SVNParentPath,以后每次在根目录下面加入新的repository就不需要再重新配置Subversion和Apache了,自动获取了根目录的配置信息,很方便。然而这也引发了另外一个问题,当你在浏览器地址栏里输入http://youserver/svn/的时候,服务器会报错,提示你没有权限访问访问这个url,我们想要的效果是浏览到这个url时能够把根目录下的所有的repository列出来。完成这个工作需要写点代码了,使用的工具可以是很多,这里使用php,当然我想用perl或者python一定是没有问题。首先要安装php,使apache支持php. 以下是参考了shg918的文档,在此表示感谢!

    首先去http://www3.skycn.com/soft/9122.html 下载php4.3.1,接下来我们来手动配置一下apache。
    将下载的php压缩文件解压,文件夹改名为php复制到你想放置的目录路径下,注意目录名不能有空格,否则apache会找不到相关的module,比如D:/php-4.3.10RC1-Win32。
    打开刚才解压的PHP目录,你会发现有一个叫做"php.ini-dist"的文件,这就是PHP的配置文件了,你需要把它改名成"php.ini",然后复制到系统目录windows(2K应该是winnt)下。打开这个配置文件,把; cgi.force_redirect = 1改成 cgi.force_redirect = 0,这样做是强迫不运行在cgi模式下,我们希望php工作在Apache的module模式下。
    PHP安装目录下的"php4ts.dll"必须要复制到windows系统的system32目录下。
    dlls和extensions目录里的所有文件拷到system32里。(我猜测这里是为了支持mysql等才需要作的,可能对我们来说并不需要。)
    打开Apache的配置文件http.conf,在module配置节末尾加上LoadModule php4_module D:/php-4.3.10RC1-Win32/sapi/php4apache2.dll和AddType application/x-httpd-php .php .php3 .php4
    Ok,配置完毕,现在Apache可以支持php了。现在用文本编辑器编写一个php文件,保存为svn_index.php,内容如下:
     
     
    <html>
     
    <head>
     
    <title>Subversion Repositories</title>
     
    </head>
     
    <body>
     
     
     
    <h2>Subversion Repositories</h2>
     
    <p>
     
    <?php
     
        $svnparentpath = "e:/svn";
     
        $svnparenturl = "/svn";
     
     
     
        $dh = opendir( $svnparentpath );
     
        if( $dh ) {
     
            while( $dir = readdir( $dh ) ) {
     
                $svndir = $svnparentpath . "/" . $dir;
     
                $svndbdir = $svndir . "/db";
     
                $svnfstypefile = $svndbdir . "/fs-type";
     
                if( is_dir( $svndir ) && is_dir( $svndbdir ) ) {
     
                    echo "<a href=\"" . $svnparenturl . "/" .
     
                            $dir . "\">" . $dir . "</a>\n";
     
                    if( file_exists( $svnfstypefile ) ) {
     
                        $handle = fopen ("$svnfstypefile", "r");
     
                        $buffer = fgets($handle, 4096);
     
                        fclose( $handle );
     
                        $buffer = chop( $buffer );
     
                        if( strcmp( $buffer, "fsfs" )==0 ) {
     
                            echo " (FSFS) <br />\n";
     
                        } else {
     
                            echo " (BDB) <br />\n";
     
                        }
     
                    } else {
     
                        echo " (BDB) <br />\n";
     
                    }
     
                }
     
            }
     
            closedir( $dh );
     
        }
     
    ?>
     
    </p>
     
    </body>
     
    </html>
     
    上述php文件中svnparentpath = "e:/svn";需要注意,你的subversion的代码仓库的根目录可能并不在e:/svn,请修改和你自己设置一样的路径。更改Apache的配置文件http.conf文件,把#LoadModule rewrite_module modules/mod_rewrite.so前面的注释去掉。然后在文件末尾加上如下几句:
    RewriteEngine on
    RewriteRule ^/svn$ /svn_index.php [PT]
    RewriteRule ^/svn/$ /svn_index.php [PT]
    RewriteRule ^/svn/index.html$ /svn_index.php [PT]
    好了,请从新在浏览器地址栏中输入http://youserver/svn ,你会发现Apache会把当前Subversion根目录下的所有代码仓库列出来了。如图

    Subversion配置安装教程(一)

    引言:一直以来我都认为,MS应该从开源项目中汲取有益的东西,开源项目也要向MS学习,而不是象网上每次提到.Net和Java就要打嘴仗一样,有些文人相轻的意思。^……^我从工作以来很有幸的能够参与多个Java和.Net项目开发,时常在这两种技术之间比较思考,现在有机会和大家分享,说的不对的地方,请大家多多指教。首先我准备谈谈SCM,个人认为在现在的大型软件开发中,团队合作是项目成功最重要的因素之一,尤其是使用.Net和Java这些强大的面向对象的语言开发程序,必然会多次分层,基于组件的共享等等,所以SCM就更重要了。MS的VSS我想大家应该都用过,也知道VSS的优劣,我就不多说了。(风传VSS不是MS自己开发的,记得有次我去过真正开发VSS的公司的网站,现在地址也忘记了。并且MS内部也不会使用VSS作为自己的SCM工具,呵呵,不知道是不是真的?)在以后的系列文章里,我会讲解Subversion,CVS这些主流的开源项目SCM工具,并且会延伸到CI(Continues Integration,即继续集成)和BugTrace领域,毕竟只有版本控制系统对于一个大型软件的开发是远远不够的。在这个旅程中,我还会带大家领略一下python(我的最爱。。。呵呵,不想试试吗?非常强大!)的旖旎风光,而且这一系列文章也会收录在我准备撰写的《Using Open Source Software to Implement Your .Net Applications》(中英双语版,呵呵。。。考察一下自己的英语)。首先来介绍一下Subversion,以下引自赛迪网-开放系统世界,作者:顾宏军
        长久以来,在开源世界中,CVS(Concurrent Versions System)一直都是版本控制的首选。但是现在用户有了另一个选择,就是Subversion。Subversion是下一代版本控制系统,能替代CVS,项目主页是http://subversion.tigris.org。 
        Subversion是一个自由、开放源码的版本控制系统。它是一个通用系统,可用来管理任何类型的文件, 其中包括程序源码。 
        它的初始目标很明确,实现绝大部分CVS的已有功能;充分考虑现有的CVS用户,在使用方式上模仿CVS,同时开发了一系列工具,使得基于CVS的项目能够顺利迁移到Subversion上。和CVS相比,它有很多优点,例如目录版本控制、不可分割的提交、一致的数据处理方式和更有效率的分支与标记等。。。
    如果你使用过CVS就能体会到上文所说的Subversion好处了,比如目录版本控制,目录的改名等。对于Subversion的原子提交,我想多说几句,大家可以想象,我们一般做一个修改,可能需要改动多个文件,尤其现在大家多对分层已经趋之若鹜了,除非你还在用着哪种什么东西都写在一起的语言。(比如PB?呵呵,感觉好像是这样的东西。我现在正在作一个遗留系统的迁移到.Net上的工作,这个系统就是用类似PB的一种脚本语言Panther,ui,逻辑和数据访问全在一个文件里面,我在代码里面还看到了80年代的注释。呵呵,很强吧?我们公司几个程序员可能是中国为数不多的懂panther语言的人了。扯远了。。。)如果你的一次提交过程中,由于网路原因或者机器的硬件原因或者根本是你自己落下了一些文件没提交,在逻辑意义上这次提交是不完整的,Subversion的原子提交能很好的解决这个问题,个人认为这也是对于CVS最大的改进了。怎么样,是不是有些想数据库的事务的概念呢?动心了吧?ok,废话少说,let's go!(Follow me! Fire in the hole!^……^)
    Subversion有两种运行方式,一种是基于Apache Http Server,另外一种是Subversion Standalone Server。下面我讲解的是基于Apache Http Server的Subversion,这样做几个好处:A.能使用WebDAV协议。B.能使用浏览器作为客户端工具浏览源码仓库。C.可以很容易的支持到SSPI(Windows域认证)和LDAP(AD?),这些都是Apache本身就支持的。D.能得到比较完善的Apache安全认证系统,比如SSL加密连接。
    在正式安装配置Subversion之前我们先来作点准备工作,由于我们以后会经常在命令行下执行命令,每次打开一个新的命令行窗口默认的当前目录都是C:\Documents and Settings\$UserName,这样在执行命令之前都要切换目录,很麻烦,所以我们先来解决这个问题。在“开始”-“运行”中输入“regedit”,打开注册表。找到\HKEY_CLASSES_ROOT\Folder\shell,如果没有shell,可以在Folder下新建一个名为shell的键,在shell下新建一个名为“命令行(Command Windows)”的键,在这个键之下再建一个新的名为“Command”的键,设置默认值为“cmd /K cd /d %L”。
     
    完成后的效果如下:
     
    这样当我们选中一个目录,在右键上下文菜单里面就多了一个“命令行(Command Windows)”的选项,单击这个选项就可以打开一个命令行窗口并且快速切换到当前选中的目录。说些题外话,很多人提到MS就义愤填膺,可是有多少人真正掌握MS的技术呢?比如这个小小的CMD命令,建议大家在命令行窗口中输入“cmd /?”,相信收获不少。前段时间在看候捷先生的《Word的排版艺术》,china-pub上很多留的书评都是不屑一顾,我不知道这些人是不是真的能把WinWord作为自己的“写作平台”?以前我都是用DockBook作为写作的工具,现在才知道Word可以这样用,MS也不是一无是处呀。。。
    注意:如果你使用WinXP作为Subversion服务器,请打上SP1补丁,否则会导致错误的网络数据传输使Subversion的数据库不能正常使用。(我自己的Notebook是WinXP SP2,工作良好,至于Win2K没有测试,我想应该不会有什么问题吧?)
    安装Subversion:
    1.到www.apache.org上下载apache http server,注意要下载2.0.X以上的版,否则不能和当前最新的Subversion工作。
    2.到http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91上下载Subversion当前1.1.3版本的二进制安装文件,一般tigris.org并不提供二进制包,这些二进制包是有一些志愿者维护的,所以可能不是当前最新的版本。如果你想尝鲜使用Subversion的最新版,请下载源码自己编译。
    3.安装apache http server
    4.安装Subversion
    5.检查$\apache group\apache2\modules下是不是已经有了mod_dav_svn.so和mod_authz_svn.so
    6.检查$\apache group\apache2\modules下是不是已经有了libdb42.dll,如图:
     
    7.搜索$\apache group\apache2\conf\httpd.conf配置文件中的#LoadModule dav_fs_module modules/mod_dav_fs.so,把前面的注释#去掉;并检查LoadModule配置节的末尾是不是有了LoadModule dav_svn_module modules/mod_dav_svn.so和LoadModule authz_svn_module modules/mod_authz_svn.so,如图:
     
    注意,请先安装Apache,然后再安装Subversion,这样上述5,6,7步骤都可以免了,在安装Subversion过程中它会自动拷贝相应文件到相应目录中,并且修改http.conf文件,然后重新启动apache服务使修改生效。但是我发现现在这个版本的Subversion安装文件可能有个bug,apache的http.conf的配置文件中#LoadModule dav_fs_module modules/mod_dav_fs.so注释没有去掉,所以大家还是小心检查一下。如果你是先安装的Subversion,然后再安装的Apache的,那么上述的步骤一个也不能漏,都需要自己手动完成。
    配置Subversion:
    1.在硬盘上建立源码库的根目录,例如E:\SVN
    2.在E:\SVN之下建立一个新的目录,例如TestRepository作为我们的测试源码库
    3.建立Subversion数据库,当前版本Subversion支持两种格式数据库,一种是FSFS,另外一种是BDB( Berkeley Database)。在命令行下输入svnadmin create --fs-type bdb TestRepository建立BDB格式的数据库(确保当前目录已经切换到E:\SVN\),在命令行下输入svnadmin create --fs-type fsfs TestRepository建立FSFS格式的数据库(确保当前目录已经切换到E:\SVN\)。建好数据库以后,到E:\SVN\TestRepository下看看是不是多了很多目录和文件,可以研究一下这些文件,对理解Subversion有帮助,但是不要试图直接修改这些文件!如图:
     
    如果大家经常关注开源技术,就知道BDB是一个轻量级的关系数据库,可以作为一个轻巧的内置数据库,在很多开源项目下有很多应用,比如CVSTrac。FSFS格式主要的特点是可以支持Subversion的数据库和Subversion服务器可以在不同的物理机器上,可以通过网络共享(不知道是否支持NFS?),能很好的工作在MS Win98上,并且速度更快,但是由于FSFS是一种新的格式,稳定性可能没有BDB好。推荐大家使用BDB,毕竟BDB有很多年开发历史,比较稳定,而且我觉得把Subversion的DB和服务器分开放置好像没有什么必要吧?(谁能告诉我这样做的好处?),大家也不会拿一台Win98作server吧?^……^。不要试图在BDB的格式的数据库上使用网络共享,也不要使用网络磁盘映射,否则会导致无法预料的错误。
    4.打开$\apache group\apache2\conf\httpd.conf配置文件,在文件的末尾加入以下语句,
    <Location /svn>
    DAV svn
    SVNParentPath e:\SVN
    AuthType Basic
    AuthName "Subversion repositories"
    AuthUserFile passwd
    #AuthzSVNAccessFile svnaccessfile
    Require valid-user
    </Location>
    这里建立了一个虚拟目录http://yourServer/svn/,所有的Subversion源码仓库都在这个虚拟目录中,并且使用“passwd”文件中username/password(用户名/密码)列表访问http://yourServer/svn/。关于Subversion的安全配置是一个比较重要的部分,我会留到下次配置SSL加密连接再讲。
    5.在命令行下切换到$\apache group\apache2,执行bin\htpasswd -c passwd <username>,这里<username>是你想要加入的用户名,比如doudou。执行这个命令成功以后就会在bin目录下建立一个passwd文件,之后如果再加入新的用户和更改已有用户的密码,执行bin\htpasswd passwd <username>即可。如图:
     
    注意一定要在$\apache group\apache2下执行,这样生成的passwd文件$\apache group\apache2根目录下,而不是在bin目录下,apache默认是在$\apache group\apache2根目录下寻找passwd文件,如果你在bin目录下执行了这个命令请把生成的passwd文件剪切到$\apache group\apache2根目录下。这一点也可以从Apache的log日志中看得出来,如图:
     
    6.重启Apache服务
    7.在浏览器地址栏中输入 http://YourServer/svn/TestRepository,输入用户名密码,ok。Subversion现在已经可以正常工作了。如图:
     
    April 05

    判断当前机器是否锁定

    function IsWorkstationLocked: Boolean;
    var
      hDesktop: HDESK;
    begin
      Result := False;
      hDesktop := OpenDesktop('default',
        0, False,
        DESKTOP_SWITCHDESKTOP);
      if hDesktop <> 0 then
      begin
        Result := not SwitchDesktop(hDesktop);
        CloseDesktop(hDesktop);
      end;
    end;
    April 04

    学会使用脚本恢复Windows XP系统的用户密码

    学会使用脚本恢复Windows XP系统的用户密码

    用一种不用第三方软件的方法来恢复管理员密码,大家可以看看这招技巧如何。

       Windows XP启动脚本(startup scripts)是计算机在登录屏幕出现之前运行的批处理文件,它的功能类似于Windows 9×和DOS中的自动执行批处理文件autoexec.bat。利用这个特性,可以编写一个批处理文件重新设置用户密码,并将它加入启动脚本中,这样就达到了目的。以下是具体步骤(假设系统目录为C:\Windows)。

       1.使用Windows98启动盘启动电脑。编写一个能恢复密码的批处理文件a.bat,内容只需要一条“net user”命令即可:“Net user rwd 12345678”。这条命令的意思是将用户rwd的密码设置为“12345678”(有关Net命令的用法,可参考Windows帮助)。然后将文件a.bat保存到“C:\windows\system32\GroupPolicy\Machine\Scripts\Startup”下。

       2.编写一个启动/关机脚本配置文件scripts.ini,这个文件名是固定的,不能改变。内容如下:

      [Startup]

      0CmdLine=a.bat

      0Parameters=

       3.将文件scripts.ini保存到“C:\winnt\system32\GroupPolicy\Machine\Scripts”下。scripts.ini保存着计算机启动/关机脚本的设置数据,文件内容通常包含两个数据段:[Startup]和[Shutdown]。[Startup]数据段下是启动脚本配置,[Shutdown]数据段下是关机脚本配置。每个脚本条目被分成脚本名和脚本参数两部分存储,脚本名保存在XCmdLine关键字下,参数保存在XParameters关键字下,这里的X表示从0开始的脚本序号,以区别多个脚本条目和标志各脚本条目的运行顺序。

       4.取出Windows 98启动盘,重新启动电脑,等待启动脚本运行。启动脚本运行结束后用户rwd的密码就被恢复为“12345678”。

       5.登录成功后删除上述步骤建立的两个文件。

       说明:电脑使用的是FAT32文件系统,如果使用NTFS文件系统,可以将这块硬盘以从盘模式挂接到其它能识别NTFS文件系统(如Windows 2000或Windows XP)的计算机上进行上述操作。本方法可以恢复管理员(Administrator)的密码。对Windows2000系统中本地计算机用户和域用户的密码恢复同样有效。
    March 31

    纯sql实现24算法

    set nocount off
    declare @a decimal(10,6),
    @b decimal(10,6),
    @c decimal(10,6),
    @d decimal(10,6)
    select @a=1,@b=5,@c=5,@d=9---给出四个数字,列出加减乘除后结果为24的算式!
    declare @t table(id int identity,num decimal(10,2))
    insert @t select @a union all select @b union all select @c union all select @d
    declare @result table(str1 varchar(100),str2 varchar(100),result decimal(10,6))
    insert @result select rtrim(id)+'#'+rtrim(cast(num as int)),rtrim(cast(num as int)),num from @t
    declare @i int
    set @i=1
    while @i<4
    begin
    insert @result select distinct A.str1+'+'+rtrim(id)+'#'+rtrim(cast(num as int)),A.str2+'+'+rtrim(cast(num as int)),result+num from @result A,@t B where charindex(rtrim(id)+'#'+rtrim(cast(num as int)),str1)=0
    and not (num+result<>24 and len(str2)-len(replace(replace(replace(replace(str2,'+',''),'-',''),'*',''),'/',''))=2)
    /*
    and not exists (select 1 from @result where str2=A.str2+'+'+rtrim(cast(B.num as int)))
    and not exists (select 1 from @result where str2=rtrim(cast(num as int))+'+'+A.str2 )
    */
    insert @result select distinct A.str1+'-'+rtrim(id)+'#'+rtrim(cast(num as int)),A.str2+'-'+rtrim(cast(num as int)),result-num from @result A,@t B where charindex(rtrim(id)+'#'+rtrim(cast(num as int)),str1)=0
    and not (result-num<>24 and len(str2)-len(replace(replace(replace(replace(str2,'+',''),'-',''),'*',''),'/',''))=2)
    insert @result select distinct case when charindex('-',str2)>0
                               then  rtrim(id)+'#'+rtrim(cast(num as int))+'-('+A.str1+')'
                               else rtrim(id)+'#'+rtrim(cast(num as int))+'-'+A.str1
                               end,
                          case when charindex('-',str2)>0
                               then rtrim(cast(num as int))+'-('+A.str2+')'
                               else rtrim(cast(num as int))+'-'+A.str2
                               end
    ,num-result from @result A,@t B where charindex(rtrim(id)+'#'+rtrim(cast(num as int)),str1)=0  and not (num-result<>24 and len(str2)-len(replace(replace(replace(replace(str2,'+',''),'-',''),'*',''),'/',''))=2)
    insert @result select distinct
       case when charindex('+',A.str1)>0 or charindex('-',A.str1)>0
            then '('+A.str1+')*'+rtrim(id)+'#'+rtrim(cast(num as int))
            else  A.str1+'*'+rtrim(id)+'#'+rtrim(cast(num as int))
            end,
       case when charindex('+',A.str2)>0 or charindex('-',A.str2)>0 
            then '('+A.str2+')*'+rtrim(cast(num as int))
            else A.str2+'*'+rtrim(cast(num as int))
            end,
    result*num from @result A,@t B where charindex(rtrim(id)+'#'+rtrim(cast(num as int)),str1)=0  and not (num*result<>24 and len(str2)-len(replace(replace(replace(replace(str2,'+',''),'-',''),'*',''),'/',''))=2)
    /*
    and not exists (select 1 from @result where str2=(case when charindex('+',A.str2)>0 or charindex('-',A.str2)>0 
            then '('+A.str2+')*'+rtrim(cast(B.num as int))
            else A.str2+'*'+rtrim(cast(B.num as int))
            end))
    and not exists (select 1 from @result where str2=(case when charindex('+',A.str2)>0 or charindex('-',A.str2)>0 
            then rtrim(cast(B.num as int))+'*('+A.str2+')'
            else rtrim(cast(B.num as int))+'*'+A.str2
            end) )
    */
    insert @result select distinct
       case when (charindex('+',A.str1)>0 or charindex('-',A.str1)>0) and charindex('(',str1)=0
            then '('+A.str1+')/'+rtrim(id)+'#'+rtrim(cast(num as int))
            else  A.str1+'/'+rtrim(id)+'#'+rtrim(cast(num as int))
            end,
       case when charindex('+',A.str2)>0 or charindex('-',A.str2)>0  and charindex('(',str2)=0 
            then '('+A.str2+')/'+rtrim(cast(num as int))
            else A.str2+'/'+rtrim(cast(num as int))
            end,
    result/num from @result A,@t B where charindex(rtrim(id)+'#'+rtrim(cast(num as int)),str1)=0 and num<>0  and not (result/num<>24 and len(str2)-len(replace(replace(replace(replace(str2,'+',''),'-',''),'*',''),'/',''))=2)
    insert @result select distinct
       case when (charindex('+',A.str1)>0 or charindex('-',A.str1)>0) and charindex('(',str1)=0
            then rtrim(id)+'#'+rtrim(cast(num as int))+'/('+A.str1+')'
            else rtrim(id)+'#'+rtrim(cast(num as int))+'/'+A.str1
            end,
       case when ((charindex('+',A.str2)>0 or charindex('-',A.str2)>0)  and charindex('(',str2)=0) or charindex('/',str2)>0 or charindex('*',str2)>0
            then rtrim(cast(num as int))+'/('+A.str2+')'
            else rtrim(cast(num as int))+'/'+A.str2
            end,
    num/result from @result A,@t B where charindex(rtrim(id)+'#'+rtrim(cast(num as int)),str1)=0 and result<>0  and not (num/result<>24 and len(str2)-len(replace(replace(replace(replace(str2,'+',''),'-',''),'*',''),'/',''))=2)
    set @i=@i+1
    end
    --select cast(rtrim(str2) as varchar(20)) 计算公式 from @result order by cast(rtrim(str2) as varchar(20))
    select distinct cast(rtrim(str2) as varchar(20)) 计算公式 from @result where  result=24 and len(str2)-len(replace(replace(replace(replace(str2,'+',''),'-',''),'*',''),'/',''))=3

    BugFree 1.0 使用MySQL 5 乱码的最终完美解决方案

    安装MySql时选择的默认字符集为UTF8
    1.先用下列语句导出数据
    mysqldump -uroot -p --default-character-set=latin1 --skip-opt bugfree > test.sql
    此时在Test.sql语句中即可以看到中文的数据库内容
    2.在数据库中将BugFree删除,并重新用以下语句重建一个新库
    mysql> CREATE DATABASE `Bugfree` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
    3.然后用下列语句将前边导出的数据导入到新建的库中
    C:\MySQL5\bin>mysql -uroot -p BugFree<test.sql
    这时候可用PhpMyadmin查看数据库内容,即可看到中文的内容
    4.在SetupBug.inc.php文件的第60行插入$MyDB->Query("Set Names 'utf8'");
    即将
    $MyDB->Connect($BugConfig["BugDB"]["Host"],$BugConfig["BugDB"]["User"],$BugConfig["BugDB"]["Password"],$BugConfig["BugDB"]["Database"]);
    $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
    改为
    $MyDB->Connect($BugConfig["BugDB"]["Host"],$BugConfig["BugDB"]["User"],$BugConfig["BugDB"]["Password"],$BugConfig["BugDB"]["Database"]);
    $MyDB->Query("Set Names 'utf8'");
    $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;

    我的运行环境:Win2003 Standand Sp1,Apache 2.0.55,Php 5.1.2 ,Mysql 5.0.18,BugFree 1.0,phpMyAdmin 2.7.0-pl2
    March 23

    cvs2svn

    c:\Python24\python.exe c:\cvs2svn-1.3.0\cvs2svn -s c:\svndata  --use-cvs --encoding=gb2312 c:\newcvsrepo

     
    c:\newcvsrepo 为CVS中的项目单独复制一份,另内部需建一个CVSRoot空目录即可骗过Cvs2svn
     
     
    到http://unxutils.sourceforge.net/下载取得sort.exe
    March 17

    Win2003下APACHE+PHP5+MYSQL4+PHPMYADMIN 的简易安装配置

     
     
    第一步: 安装apache 并配置支持PHP

    点击安装文件apache_2.0.50-win32-x86-no_ssl.msi
    将apache安装在 D:\apache2 目录(随自己喜好)下
    将php-5.0.0-Win32.zip 里内容解压到 D:\php 里
    找到 php目录里的 php.ini-dist 重命名为 php.ini 并拷到 windows目录里(win2k 里为winnt)
    如我的php.ini是拷到 D:\windows目录
    再将php目录里的 php5ts.dll,libmysql.dll 拷到 系统目录(system/system32) 如我的是D:\windows\system里


    配置apache里的httpd.conf
    打开 D:\Apache2\conf\httpd.conf 这个文件
    找到 AddDefaultCharset ISO-8859-1 将其改为 AddDefaultCharset GB2312 (让默认语言编码为简体中文)
    找到 DocumentRoot "D:/Apache2/htdocs" 将其改为你的WEB目录(可不改)如我的为 DocumentRoot "D:/website"
    找到 DirectoryIndex index.html index.html.var 在后面加入 index.htm index.php

    选择安装模式: 模块化模式安装 或 CGI模式安装 (选一样即可)

    --------------模块化安装配置------------------------------------
    找到 #LoadModule ssl_module modules/mod_ssl.so 这行,在此行后加入一行
    LoadModule php5_module d:/php/php5apache2.dll
    其中d:/php/php5apache2.dll 为你php目录中php5apache2.dll所在的位置
    找到 AddType application/x-gzip .gz .tgz 这行,在此行后加入一行
    AddType application/x-httpd-php .php
    ---------------------------------------------------------------

    --------------CGI安装配置--------------------------------------
    找到 AddType application/x-gzip .gz .tgz 这行,加入如下即可
    ScriptAlias /php/ "d:/php/"
    AddType application/x-httpd-php .php
    Action application/x-httpd-php "/php/php-cgi.exe"
    ---------------------------------------------------------------

    此时PHP环境基本已经配置成功
    在WEB根目录(如我的D:\website)里建一个名为test.php的文件内容如下
    <? echo phpinfo(); ?>
    重新启动apache服务
    用浏览器打开 http://localhost/test.php
    如果可以看到php配置输出信息就OK了

    第二步 安装mysql

    将mysql安装到指定目录,如我的是d:/mysql 如下载的是非安装的mysql压缩包,直接解压到指定目录就可以了
    然后点击D:\mysql\bin\winmysqladmin.exe这个文件 其中D:\mysql是你的mysql安装目录
    输入winmysqladmin的初始用户、密码 (注:这不是mysql里的用户、密码)随便填不必在意
    确定之后你的右下角任务的启动栏会出现一个红绿灯的图标,红灯亮代表服务停止,绿灯亮代表服务正常,左击这个图标->winnt->install the service 安装此服务
    再左击这个图标->winnt->start the service 启动mysql服务

    修改mysql数据库的root密码
    用cmd进入命今行模式输入如下命令: ( 注: d:\mysql 为mysql安装目录)
    cd d:\mysql\bin
    mysqladmin -u root -p password 123456
    回车出现
    Enter password: ( 注:这是叫你输入原密码. 刚安装时密码为空,所以直接回车即可)
    此时mysql 中账号 root 的密码 被改为 123456 安装完毕

    三、配置php.ini并测试mysql(php.ini为 d:\windows下的 php.ini)

    找到extension_dir = "./" 改为 extension_dir = "d:/php/ext"
    找到
    ;extension=php_mysql.dll
    将';'去掉改为
    extension=php_mysql.dll
    找到
    ;session.save_path = "/tmp"
    将';'去掉 设置你保存session的目录,如
    session.save_path = "D:/php/session_temp";

    重启apache服务
    在Web根目录下(如 D:\website)建立testdb.php文件内容如下:
    <?php
    $link=mysql_connect('localhost','root','123456');
    if(!$link) echo "fail";
    else echo "success";
    mysql_close();
    ?>
    用浏览器打开http://localhost/testdb.php 如果输出success就OK了

    四、phpmyadmin的安装配置

    将phpMyAdmin-2.5.7.zip解压到WEB根目录中去,重命名文件夹为phpmyadmin或其它
    打开phpmyadmin 目录中的 config.inc.php
    找到
    $cfg['Servers'][$i]['user'] = 'root';
    $cfg['Servers'][$i]['password'] = '123456';
    分别填上你mysql的用户和密码即可

    如不是本地使用,最好加上验证

    不知道写得对不对!不过我基本上就是这样配的! 对于学习来讲应该差不多了吧?

    有什么错误或漏掉的地方望大家指出批评!----by luck_mlc
    March 06

    CVSNT的用户验证方式

    转自: http://edu.tmn.cn/html/5/47/185/2005210/104247.htm 

    先说下CVSNT的用户验证方式,CVSNT的用户验证方式分两种:Windows系统用户与CVSNT用户共存的混合验证方式,及CVSNT用户 单一验证方式,默认工作在混合验证方式下,当然使用单一验证方式对用户的管理肯定比较方便一点,因此下面的配置就是围绕该方式进行的。各个资源库所使用的 验证方式及用户配置由其目录下CVSROOT里的配置文件决定,其中有几个比较重要的文件。


    1、config文件

    控制CVSNT的验证工作方式的就是config文件,注意该文件最前面的两行:

    #Set this to `no" if pserver shouldn"t check system users/passwords
    #SystemAuth=yes

    第二行就是我们要修改的内容,默认状态是被注释掉的,SystemAuth有两个值yes和no:

    yes:pserver将使用Windows系统用户和CVSNT用户来共同验证(若CVSNT用户未定义,则用Windows系统用户来进行验证),默认为yes,CVSNT用户在后面将要介绍的passwd文件中定义。

    no:只使用CVSNT用户来进行验证。

    该文件可以在客户端进行修改,因此我们可以将其checkout出来将第二行改为SystemAuth=no,并commit到CVSNT上就可以启用单一验证方式了,注意启用单一验证方式后原来的Windows系统用户将变为无效,因此要注意执行该步骤的时机。

    2、 admin文件

    该文件保存CVSNT管理员用户列表,内容很简单,形式如下:
    User1
    User2
    User3
    每一行定义一个管理 员用户,默认时没有该文件,但你可以在客户端自己添加并add上去,再commit到CVSNT上,但是光有这个文件还是不会生效的,还要将其添加到 checklist文件中,使CVSNT能够读取该文件的内容,在checklist中添加文件列表的格式为:

     [空格]文件名 出错信息

    其中文件名前的空格必须要有的,不然会出错。
    我们可以先添加admin文件到CVSNT中,再修改checklist文件commit,就可以使admin文件生效了。

    3、passwd文件

    服务器工作在CVSNT用户单一验证方式下的时候,这个文件定义了CVSNT的用户信息,这里面保存着用户名,用户密码,以及别名信息。默认状态下 没有该文件,但是我们可以在CVSNT还工作在混合验证方式下时,用系统管理员登录,通过添加用户命令来让CVSNT自动建立一个passwd文件。

    添加用户的命令的示例:

    cvs passwd –r administrator –a cvsadmin

    之后系统提示输入密码,输入后服务器会新建一个passwd文件。

    该文件的内容很简单,形式如下:

    cvsadmin:fqr1fS4gDghrt:administrator
    kid:aTXRfS31Bm6JA
    mystique:Yna4QcXz9dEqd

    以第一行为例:cvsadmin为用户名,fqr1fS4gDghrt为CVS使用UNIX标准加密函数对密码进行加密后的结果,administrator为该用户的别名,当使用混合验证方式时对应Windows系统用户名。

    注意:这个文件是不能在客户端进行修改的,不能checkout出来。

    4、group文件

    该文件定义CVSNT中组信息,同组里的用户拥有一样的权限,对组权限的修改和对用户权限的修改一样。

    group文件的内容为

    administrators:cvsadmin kid mystique
    users:User1 User2 User3

    可以看到该文件的内容也很简单,组名:用户名,多个用户名之间用空格隔开。

    Group文件可以在客户端修改,不用修改checkoutlist这个文件,系统会自动使其生效。

    作为组里面的特定成员可以赋给特定的权限。

    了解了以上内容,下面我说一下我自己的配置步骤,我没有使用WinCVS进行操作,是直接使用命令行进行修改的,觉得这样思路比较清晰:

    1、添加系统变量CVSROOT=E:/CVSNT/Repository,并把E:\CVSNT加入到系统Path路径。

    2、进入命令提示符,因为此时为混合验证模式,可以不用不用登陆直接进行checkout。可以建立一个工作目录,在该目录下进行操作,我这里为E:/CVSNT/Works。

     检出CVSROOT目录:
     
     cvs co CVSROOT

    3、添加CVSNT系统管理员用户,此时会提示设置用户密码:

     cvs passwd –r administrator –a cvsadmin

    4、修改CVSROOT访问权限:

     cd CVSROOT
     cvs chown cvsadmin   //更改所有者为cvsadmin
     cvs chacl default:n   //默认权限为n
     cvs chacl cvsadmin:rwc  //添加cvsadmin

    5、修改config文件,按上面的方法修改后commit:

     cvs ci

    6、此时单一验证方式已经启用了,也就是只能使用刚才添加的cvsadmin进行登录,此时可以把CVSNT控制面板上的Use local users for pserver authentication instead of domain users关掉。登录前还要改一下系统变量CVSROOT,关闭命令提示符窗口,修改CVSROOT为:

     :pserver:cvsadmin@192.168.0.1:4021/CVSNT/Repository

    这里的192.168.0.1是服务器的IP地址,/CVSNT/Repository就是前面设置Repository时设置的Name,可以改为你机器上的配置。修改系统变量之后以下的步骤在任何与服务器相连的机器上进行,当然该机器上应该有CVSNT的可执行文件。

    7、如果为了避免出现错误,先重启一下CVSNT服务器,再启动命令提示符来到E:/CVSNT/Works,因为已经启用单一验证方式,先要进行登录。

     cvs login
     
     输入密码,此时就是以cvsadmin登录了。
     
    8、添加admin文件,首先将CVSROOT检出,在CVSROOT下新建admin文件,内容为
     
     cvsadmin
     
     执行命令:
     
     cvs add admin
     cvs ci
     
    9、修改checklist文件,在该文件末尾添加一行:

     [空格]admin  error message
     
     注意:admin前的空格不能少。
     
     执行命令:
     
     cvs ci
     
    经过以上步骤,可以说用户配置已经基本完成了,CVSNT可以很好的工作在单一验证方式下。进一步的管理可使用以下命令:

    添加用户: cvs passwd -a username,使用时不必理会需要添加别名的提示。

    修改用户权限:cvs chacl username:r|w|c|n,(r:Read w:write c:control n:none)

    要添加组管理,只需同添加admin步骤一样,按照格式要求新建group文件即可。

    如果还有不清楚的可以看看自带的文档,说得还是比较详细的。

    ok,差不多就是这些,有错还请各位帮忙指出,还在学习ING

    December 07

    谈论网站不幸被黑,数据库的表全部被删 , 恢复办法

     

    引用

    网站不幸被黑,数据库的表全部被删 , 恢复办法

    用第三方工具

    Log Explorer for SQL Server v4.0.2
    http://js.fixdown.com/soft/8324.htm

    注册机产生的是注册码,是两个

    用解压缩密码解开后,压缩包里也有一个注册机的

    打开log explorer file=>attach log file->选择服务器和登陆方式->connect->
    选择数据库->attach->左面对话框中browse->view log->就可以看到log记录了
    点击“View DDL Commands”里面就有很多drop table 命令
    点击下面的“undo”按钮是生成表结构的语句(create table ....)
    点击下面的“Salvage”按钮是生成插入语句的(insert into ...values....)
    (以上lynx1111提供)

    想恢复的话: 右键log记录 undo transation->选择保存文件名和路径->然后打开该文件到查询分析器里执行
    T-sql代码就可以了

    例如 如果log是delete table where ...的话,生成的文件代码就是insert table ....


    使用经验总结帖:
    http://community.csdn.net/Expert/topic/2954/2954818.xml?temp=.9148676

    log explorer使用的几个问题

    1)对数据库做了完全 差异 和日志备份
    备份时选用了删除事务日志中不活动的条目
    再用Log explorer打试图看日志时
    提示No log recorders found that match the filter,would you like to view unfiltered data
    选择yes 就看不到刚才的记录了


    如果不选用了删除事务日志中不活动的条目
    再用Log explorer打试图看日志时,就能看到原来的日志

    2)修改了其中一个表中的部分数据,此时用Log explorer看日志,可以作日志恢复

    3)然后恢复备份,(注意:恢复是断开log explorer与数据库的连接,或连接到其他数据上,
    否则会出现数据库正在使用无法恢复)
    恢复完后,再打开log explorer 提示No log recorders found that match the filter,would you like to view unfiltered data
    选择yes 就看不到刚才在2中修改的日志记录,所以无法做恢复.

    3)
    不要用SQL的备份功能备份,搞不好你的日志就破坏了.

    正确的备份方法是:
    停止SQL服务,复制数据文件及日志文件进行文件备份.

    然后启动SQL服务,用log explorer恢复数据

    4)
    如果你的数据库的日志恢复模型是simple,那就不可能用log explorer恢复

    5)
    Log explorer必须安装在要恢复数据库的sql server服务器上,或者在sql server服务器上安装服务端,在操作的电脑上安装客户端进行数据恢复