Oct 19

帮老婆的弟媳做一个网站,下载了一份现成的PHP代码,不过都是加了密的.有些改动需要对PHP文件进行,可是发现这份东西是用了ZEND加密的,网上现成的DEZENDER的软件不少,绝大多数是基于黑刀改装的,效果不错,可是都不能对目录结构进行原样复制.找到一份梅花三弄版 DEZENDER据说可以保持原目录结构,可是不知是什么原因,居然在我的计算机上运行不起来.于是我就想自己写一个程序来做这事,顺便学习一下C#.

Form上的几个基本控件:

  • txtFolder: PHP文件所在的根目录, 新目录将自动取名为目录名_new
  • button1: txtFolder的browse按钮
  • CheckBox1: With Subfolders 标记, 即操作是否包括各级子目录
  • CheckBox2: Process PHP files only 标记, 即操作是否只针对PHP文件,如果要针对所有文件,则非PHP文件将被复制到指定目录
  • txtLog: 日志框, 输出所有信息
  • stsInfo: StatusBar, 显示一些提示信息
  • btnList: 显示所有文件到txtLog
  • btnbProcess: 对文件进行操作

几个private变量:

 

  • private bool WithSub = true; //对应checkbox1
  • private bool PhpOnly = false; //对应checkbox2
  • private string RootDir; //对应txtFolder

检查运行环境, PHP.EXE是黑刀的执行文件, 必须在当前目录下存在.

C# 代码复制内容到剪贴板
  1. private void Form1_Load(object sender, EventArgs e)    
  2. {    
  3. if (!File.Exists(".php.exe"))    
  4. {    
  5. MessageBox.Show("No php.exe found, the program may not run properly!");    
  6. Application.Exit();    
  7. }    
  8. dlgOpenFld.SelectedPath = "D:temp";    
  9. }    

 

另外, 在PHP.INI文件中, 要确认以下文件的路径名正确, 个人感觉用相对路径会好一些

PHP 代码复制内容到剪贴板
  1. [Zend]    
  2. zend_extension_manager.optimizer_ts="libOptimizer-3.3.0"    
  3. zend_extension_ts="libZendExtensionManager.dll"   

下面, BROWSE文件夹操作.

C# 代码复制内容到剪贴板
  1. private void button1_Click(object sender, EventArgs e)    
  2. {    
  3. if ( dlgOpenFld.ShowDialog() == DialogResult.OK )    
  4. {    
  5. txtFolder.Text = dlgOpenFld.SelectedPath;    
  6. }    
  7. }    

最重要的操作之一, 用递归取得文件列表, 在这一步里,用到了List<>这样的数据类型, 这是用于未知长度数组的, 可以看到, C#对于文件,目录的操作都与DELPHI有了非常大的不同, 这就是FRAMEWORK:

C# 代码复制内容到剪贴板
  1. private List<FileInfo> getFiles(string tDir, bool SubFolder)    
  2. {    
  3. List<FileInfo> FileList = new List<FileInfo>();    
  4. DirectoryInfo fDir = new DirectoryInfo(tDir);    
  5. DirectoryInfo[] subDir = fDir.GetDirectories();    
  6. FileInfo[] sFile = fDir.GetFiles();    
  7. if (SubFolder)    
  8. {    
  9. foreach (DirectoryInfo d in subDir)    
  10. {    
  11. FileList.AddRange(getFiles(tDir + "" + d.Name, SubFolder));    
  12. }    
  13. }    
  14. foreach (FileInfo f in sFile)    
  15. {    
  16. FileList.Add(f);    
  17. }    
  18. return FileList;    
  19. }    

下一步, 就是对取得的文件列表进行操作了,新文件夹自动取名为XXX_NEW, 并且对文件列表按规则进行操作, 即是只解密PHP文件, 还是要同时复制其他非PHP文件:

C# 代码复制内容到剪贴板
  1. private void button1_Click_1(object sender, EventArgs e)    
  2. {    
  3. if (!Directory.Exists(txtFolder.Text)||(txtFolder.Text.IndexOf(" ")>0))    
  4. {    
  5. MessageBox.Show("Directory "" + txtFolder.Text + "" is invalid! (No space allowed)""Invalid folder selection", MessageBoxButtons.OK,MessageBoxIcon.Error);    
  6. return;    
  7. }    
  8. RootDir = txtFolder.Text;    
  9. string newDir=RootDir + "_new";    
  10. List<FileInfo> FileList = new List<FileInfo>();    
  11. FileList = getFiles(txtFolder.Text, WithSub);    
  12.   
  13. for (int i = 0; i < FileList.Count; i++)    
  14. {    
  15. string tNewDir = FileList[i].DirectoryName.Replace(RootDir, newDir);    
  16. if (!Directory.Exists(tNewDir))    
  17. {    
  18. Directory.CreateDirectory(tNewDir);    
  19. }    
  20. if (FileList[i].Extension != ".php")//&&(FileList[i].    
  21. {    
  22. File.Copy(FileList[i].DirectoryName + "" + FileList[i].Name, tNewDir + "" + FileList[i].Name);    
  23. txtLog.AppendText("COPIED! " + i.ToString() + " - " + FileList[i].DirectoryName + "" + FileList[i].Name + "nn");    
  24. }    
  25. else    
  26. {    
  27. if (runphp(FileList[i].DirectoryName + "" + FileList[i].Name, tNewDir))    
  28. {    
  29. txtLog.AppendText("DECRYPTED! " + i.ToString() + " - " + FileList[i].DirectoryName + "" + FileList[i].Name + "nn");    
  30. }    
  31. else    
  32. {    
  33. txtLog.AppendText("FAILED TO DECRYPT! " + i.ToString() + " - " + FileList[i].DirectoryName + "" + FileList[i].Name + "nn");    
  34. }    
  35. }    
  36. }    
  37. }   

这是解码PHP文件, 通过建立新进程来调用外部EXE文件:

C# 代码复制内容到剪贴板
  1. private bool runphp(string filename, string NewFolder)    
  2. {    
  3. try    
  4. {    
  5. string EXE_PATH = @".";    
  6. System.Diagnostics.Process process = new System.Diagnostics.Process();    
  7. process.StartInfo.FileName = "php.exe";    
  8. process.StartInfo.WorkingDirectory = EXE_PATH;    
  9. process.StartInfo.CreateNoWindow = true;    
  10. process.StartInfo.Arguments = filename + " /tab /indent:1 /path:" + NewFolder + " /ext:* /noexpire";    
  11. process.Start();    
  12. if (process.HasExited)    
  13. {    
  14. //txtLog.AppendText("finished!nn");    
  15. //return true;    
  16. }    
  17. return true;    
  18. }    
  19. catch (Exception e)    
  20. {    
  21. throw e;    
  22. //return false;    
  23. }    
  24.   
  25. }    

其他的代码就不一一罗列了. 只是临时使用的代码, 功能还非常简单.

 

Tags: , ,
Oct 19

 一直想要搞一个自己的BLOG系统,以便能够象个笔记本一样记录一点东西.曾经申请了GOOGLE的BLOGSPOT和MSN空间,都有非常不尽如人意的地方,比如说,BLOGSPOT的功能非常欠缺,简直就是一个NOTEPAD.而MSN的倒是很花哨,可都是些我并不需要的功能,上传图片,插入代码都不能很好地实现,所以就想自己装一个BLOG系统在家里的服务器上.虽然家用网络上传速度只有512K,但是只我一个人用,没关系.用得好了找个空间上传也不错啊,呵呵

试过了几个系统,比如说BO-BLOG,CTB-BLOG,SA-BLOG,TYPECHO,个人觉得还是这个BO-BLOG系统最合适,因为它至少有我所需要的这些功能:

1. 简洁的外观

2. 首页直接登录和发帖链接, 如果一定要登录确认再发帖真是非常麻烦的事

3. 一个优秀的编辑器, BO-BLOG默认的编辑器很普通,但是可以下载并安装FCKeditor可视化编辑器,这个编辑器不是一般的强,本地上传插入图片,加入代码,文本编辑等内容应有尽有.可说是最强的编辑器了

4. 有良好的扩展性.虽然我并不一定会使用那些音乐皮肤等内容,但是备着这功能总是能让人更满意.

差不多就这些了吧,对了,刚开始时我是把BO-BLOG安装到免费空间的, 后来才复制到自家机器上. 改变网站的URL以后,记得要修改BLOG\DATA\CONFIG.PHP文件,把$config['blogurl']变量改为新的网址.

 

Tags: ,
Oct 19

 今天收到一封信,是从ATOS数据库服务器代理那儿发来的,说发现服务器运行有错误:

The job failed. Unable to determine if the owner (域\用户) of job Replication agents checkup has server access (reason: Could not obtain information about Windows NT group/user '域\用户', error code 0x5. [SQLSTATE 42000] (Error 15404)).

I did not find any login by the name 域\用户 on the server, but there was user on database PVTxxxx05 by the same name and it mapped on to login mySQLLOGINNAME which had dbo rights on the database.

The error [SQLSTATE 42000] (Error 15404) most likely means the machine account doesn't have permission to query the Active directory, cause generally the local service does not have any rights to query / check the identity of the connecting user.

Changing the job owner to sa might solve the issue.

Kindly look into it and suggest on it.

查了一下服务器的EVENT VIEWER,这个错误原来从开始使用起就一直存在,只不过没有发现而已,这个错误并不影响REPLICATION的运行.
 
 
打开SQL Server管理器,在SQL SERVER AGENT节点下,打开JOB节点下有一项"Replication Agents checkup", 正是这项JOB出错了.原来的OWNER是WINDOWS域用户,错误既然是说原来的OWNER不能正常工作,那就把原来的OWNER从域用户改为本地SQL登录名再试.
 
修改以后,发现此错误不再出现了. 
 
其实还有一套方案,那就是直接把这项JOB的ENABLE复选框取消,反正这项工作并不影响REPLICATION.
 
Oct 8

家里的服务器安装的WINDOWS 2008一直只是做为文件共享服务使用,这几天心血来潮想装个ACTIVE DIRECTORY来玩玩,安装完毕后新添用户时,却被报错说密码不符安全策略.安全当然重要,不过在自己家里,这个策略对自己无所谓,对老婆孩子老人来说就太麻烦了,去掉比较好.

可是进入本地安全策略进行管理时,发现密码策略已经被锁定,无法更改.

 

 

 

经过查阅资料,在此情况下要改密码策略的过程如下:

1. 进入组策略管理

 

 

2. 右键点击/编辑Default Domain Policy

 

 

3. 在这里, 可以对密码复杂性要求进行禁用.

 
 

4. 禁用并确定后, 此策略并没有被立即应用, 还要运行一下gpupdate /force 应用一下方能生效

 

 
 

5. 可以看到,当组策略管理器中对密码策略都取消定义后,本地密码策略即可以被更改,在本地安全策略中随意简化密码约束.

 
 

 

Oct 7

Procedure型变量: 

在DELPHI中,函数、过程的地址可以赋给一个特殊类型的变量,变量可用如下方式声明: 

var p : procedure(num:integer); //过程 

或: 

var f : function(num:integer):integer; //函数 

也可定义一个过程(或函数)类型,再定义该类型的变量,如: 

type TMyProc = Procedure(num:integer); 

var p : TMyProc; 

 

example: 

type TMyProc= procedure (filename : string); //定义过程类型 

procedure clearfile(filename : string); 

begin 

{….} 

end ; 

… 

var p:TMyProc; //定义过程变量 

… 

p := clearfile; //将具体实现的过程地址赋给过程变量 

… 

p(‘log.dat’); //调用过程 

… 

可以将该类型的变量赋nil表示清除。 

通过这种方式定义函数或过程的变量十分有用,如可用于装入动态链接库、根据不同的条件调用不同的过程等。 

 

Method型变量: 

在DELPHI中还有一种特殊的过程,叫做方法(method),在定义方法类型的时候要在过程定义的后面加上 of object,如: 

type TMyMethod=Procedure(num:integer) of object; 

同样也可定义过程类型的变量: 

var m : TMyMethod; 

可以将该类型的变量赋nil表示清除。 

方法类型常用于类定义中的事件定义,如控件中常用的OnClick事件,它的类型定义如下: 

type TNotifyEvent=Procedure(Sender : TObject) of object; 

 

区别: 

procedure与method的定义虽然很相似,但两者并不一样,也不通用,不能互相赋值。procedure型变量是一个指针指向实际的代码地址,而method型变量实际是一对指针,第一个指向代码的地址,第二个指向包含该代码的类的一个实例。区别一个过程是否是方法就看它是否属于一个类的成员。 

Example: 

Type 

TMyProc=Procedure(str : String); //定义普通过程类型 

TMyMethod=Procedure(str : String) of object; //定义方法类型 

… 

//下面的代码是一个普通的过程 

Procedure Proc1(str : String); 

Begin 

ShowMessage(str); 

End; 

… 

//下面的代码是一个方法 

Procedure TForm1.Proc2(str : String); 

Begin 

ShowMessage(str); 

End; 

… 

var p : TMyProc; 

m : TMyMethod; 

… 

p := Proc1; //正确 

m := Proc2; //正确 

p := Proc2; //错误! 

m := Proc1; //错误! 

 

在类型定义中,类型的属性(如事件)常用以下方式定义在published关键字后,如: 

property OnClick : TNotifyEvent read FOnClick write FOnClick; //FOnClick为类的方法型私有成员变量 

但published关键字后的属性不能是普通的过程类型。普通过程类型只能在类的private、public、protected成员中。而方法类型可以是类的任何类型成员。 

Example: 

Type 

TMyClass = class(TObject) 

Private 

FOnMyMethod: TMyMethod; 

FOnMyProc : TMyProc; 

Public 

Property OnMyProc1 : TMyProc read FOnMyProc write FOnMyProc; //正确 

Published 

Property OnMyMethod : TMyMethod read FOnMyMethod write FOnMyMethod; //正确 

Property OnMyProc2 : TMyProc read FOnMyProc write FOnMyProc; //错误! 

End; 

Tags: ,
分页: 19/20 第一页 上页 14 15 16 17 18 19 20 下页 最后页 [ 显示模式: 摘要 | 列表 ]