• Check {Default Path}, {EULA}, {CodeSign} of SFX file using C#


    Key words: Verify default path , EULA, CodeSign of SFX file

    Key words: Extract SFX files and Submit them to VCS

    Key words: Asynchronous callback of delegation

    I meet an issue when taking my job, everyday i had to spend a lot of time on checking SFX files' default path, EULA and code sign, so i write a tool, this tool can get all the SFX files under give folder,then it get the comment of each SFX file,then analyze the default path , copy right year in EULA, and use check trust to verify wether SFX is code signed. Another thing, I also used asynchronic callback of delegate, by using this, it can response to user's action even when it running the big job.

    Form1:

    代码
      1 using System;
      2 using System.Collections.Generic;
      3 using System.Collections;
      4 using System.ComponentModel;
      5 using System.Data;
      6 using System.Drawing;
      7 using System.Linq;
      8 using System.Text;
      9 using System.IO;
     10 using System.Text.RegularExpressions;
     11 using System.Windows.Forms;
     12 using System.Diagnostics;
     13 using System.Threading;
     14 using System.Timers;
     15 
     16 namespace CloudCDTool
     17 {
     18     public partial class CloudCDTool1 : Form
     19     {
     20         #region delegate
     21         public delegate bool del_ExtraxctAllfiles(string filename,out string buildPath);
     22         public delegate void del_SubmitToVCS(string build);
     23         public delegate void del_Elapse();
     24         public delegate void delegate_RunCase(string buildFolder, string defaulpath, string copyyear);
     25         public delegate void delegate_SetProgressMaxmum(int totalCount);
     26         public delegate void delegate_UpdateProgressValue();
     27         #endregion
     28 
     29         #region Field
     30         ArrayList exeLists = null;
     31         System.Timers.Timer etimer = null;
     32         string statusinfo = "Status";
     33         #endregion
     34 
     35         public CloudCDTool1()
     36         {
     37             InitializeComponent();
     38             exeLists = new ArrayList();
     39             etimer = new System.Timers.Timer();
     40             etimer.Elapsed += new ElapsedEventHandler(etimer_Elapsed);
     41             etimer.Interval = 1000;
     42             etimer.Start();
     43         }
     44 
     45         void etimer_Elapsed(object sender, ElapsedEventArgs e)
     46         {
     47             del_Elapse del = new del_Elapse(elaps_StatusBox);
     48             Invoke(del, new object[] { });
     49         }
     50 
     51         void elaps_StatusBox()
     52         {
     53             StatusLabel.Text = statusinfo;
     54         }
     55        
     56         private void Test_Click(object sender, EventArgs e)
     57         {
     58             string filename = @"D:\AutoTool\VAN-EX1.exe";// @"\\mslt-10\baseimages\ENU\Split\Base10C-W7-HV\Base10C-W7-HV.part01.exe";
     59             HelpRAR rarClass = new HelpRAR();
     60             bool pathPath = PathMatch(filename,"");
     61             bool eulaMath = EULAMath(filename,"");
     62         }
     63         //Test if default path match with expected one
     64         private bool PathMatch(string filename,string expectdPath)
     65         {
     66             bool pass = true;
     67             string actualPath = string.Empty;
     68             HelpRAR rarClass = new HelpRAR();
     69             string rarInfo = rarClass.rarInfo(filename);
     70             int path = rarInfo.IndexOf(@"Path=");
     71             if (path == -1)
     72             {
     73                 //No DefaultPath
     74                 pass = false;
     75                 return pass;
     76             }
     77             else
     78             {
     79                 string pattern = @"\w\:\\[\w\\\d ]+"//match c:\program files\microsoft learning\base
     80                 MatchCollection MC = Regex.Matches(rarInfo, pattern);
     81                 if (MC.Count > 0)
     82                 {
     83                     actualPath = MC[0].Value.ToString();
     84                     string expectedPath = expectdPath;
     85                     if (expectedPath.ToLower() != actualPath.ToLower())
     86                     {
     87                         pass = false;
     88                     }
     89                     return pass;
     90                 }
     91                 else //No Default Path
     92                 {
     93                     pass = false;
     94                     return pass;
     95                 }
     96             }
     97         }
     98         //Test if SFX contains EULA? EULA exists, then verify copyright year is correct?
     99         private bool EULAMath(string filename, string expectedCopyYear)
    100         {
    101             bool pass = true;
    102             HelpRAR rarClass = new HelpRAR();
    103             string rarInfo = rarClass.rarInfo(filename);
    104             int eula = rarInfo.IndexOf(@"License=");
    105             if (eula == -1)
    106             {
    107                 //No EULA
    108                 pass = false;
    109                 return pass;
    110             }
    111             else
    112             {
    113                 string EULA = rarInfo.Substring(rarInfo.IndexOf(@"License="), rarInfo.Length - rarInfo.IndexOf(@"License="));
    114                 string copryrightYear = expectedCopyYear;
    115                 if (!EULA.Contains(copryrightYear))
    116                 {
    117                     pass = false;
    118                 }
    119                 return pass;
    120             }
    121         }
    122 
    123         private void tb_CourseNumber_Leave(object sender, EventArgs e)
    124         {
    125             string enterString = tb_CourseNumber.Text.Trim();
    126             string course = Regex.Replace(enterString, @"[^\d]""");
    127             tb_DefaultPath.Text = string.Format(@"C:\Program Files\Microsoft Learning\{0}", course);
    128         }
    129 
    130         private void Asyn_Check_Click(string buildFolder, string defaulpath, string copyyear)
    131         {
    132             if (buildFolder == "")
    133             {
    134                 return;
    135             }
    136             DirectoryInfo di = new DirectoryInfo(buildFolder);
    137             string result = @"C:\CloudCDHelp\testResult.xls";
    138             if (File.Exists(result))
    139             {
    140                 try
    141                 {
    142                     File.Delete(result);
    143                 }
    144                 catch { }
    145             }
    146             FileStream fStream = new FileStream(result, FileMode.OpenOrCreate, FileAccess.Write);
    147 
    148             StreamWriter sw = new StreamWriter(fStream, Encoding.Unicode);
    149             StringBuilder line = new StringBuilder();
    150             line.Append("SFX file" + Convert.ToChar(9));
    151             line.Append("TC #Default Path" + Convert.ToChar(9));
    152             line.Append("TC #EULA" + Convert.ToChar(9));
    153             line.Append("TC #CodeSign" + Convert.ToChar(9));
    154 
    155             sw.WriteLine(line);
    156             ArrayList al = new ArrayList();
    157             al = Scan_Directory(di);
    158             if (al.Count > 0)
    159             {
    160                 delegate_SetProgressMaxmum delegate_ProgressMax = new delegate_SetProgressMaxmum(Set_ProgressMax);
    161                 Invoke(delegate_ProgressMax, new object[] { al.Count });               
    162                 
    163             }
    164             foreach (var item in al)
    165             {
    166                 ExcuteTestCase(item.ToString(), sw, defaulpath, copyyear);
    167                 try
    168                 {
    169                     delegate_UpdateProgressValue delegate_updateValue = new delegate_UpdateProgressValue(update_ProgressValue);
    170                     Invoke(delegate_updateValue, new object[] { });                    
    171                 }
    172                 catch { }
    173             }
    174             statusinfo = "Writing results to theResult.xls...";
    175             exeLists.Clear();
    176             sw.Dispose();
    177             sw.Close();
    178             statusinfo = "Opening theResult.xls...";
    179             Process.Start(result);
    180             statusinfo = "theResult.xls was Opened";
    181         }
    182         private void update_ProgressValue()
    183         {
    184             progressBar1.Value += 1;
    185         }
    186         private void Set_ProgressMax(int totalCount)
    187         {
    188             progressBar1.Maximum = totalCount;
    189             progressBar1.Value = 0;
    190         }
    191 
    192         private void check_Result(IAsyncResult ar)
    193         {
    194             delegate_RunCase del_run = (delegate_RunCase)ar.AsyncState;
    195             del_run.EndInvoke(ar);
    196         }
    197         private void bt_Check_Click(object sender, EventArgs e)
    198         {
    199             string buildFolder = tb_Folder.Text.Trim();
    200             if (!Directory.Exists(buildFolder))
    201             {
    202                 MessageBox.Show("!Dirctory not exist""Err", MessageBoxButtons.OK, MessageBoxIcon.Error);
    203                 return;
    204             }
    205             statusinfo = "Begining jobs...";
    206             string defaulpath = tb_DefaultPath.Text.Trim();
    207             string copyyear=tb_CopyrightYear .Text .Trim ();
    208             delegate_RunCase del_Runcase = new delegate_RunCase(Asyn_Check_Click);
    209             del_Runcase.BeginInvoke(buildFolder, defaulpath, copyyear, new AsyncCallback(check_Result), del_Runcase);
    210             //buildfolder, defaultpath, copyyear
    211             progressBar1.Value = 0;
    212         }
    213 
    214         private ArrayList Scan_Directory(DirectoryInfo di)
    215         {
    216             statusinfo = "Scanning files.....";
    217             try
    218             {
    219                 foreach (FileSystemInfo item in di.GetFileSystemInfos())
    220                 {
    221                     if (item is DirectoryInfo)
    222                     {
    223                         DirectoryInfo tmpDI = item as DirectoryInfo;
    224                         Scan_Directory(tmpDI);
    225                     }
    226                     else
    227                     {
    228                         FileInfo fi = item as FileInfo;
    229                         FileAttributes fileAttr = File.GetAttributes(fi.FullName);
    230                         if ((fileAttr & FileAttributes.System) == FileAttributes.System)
    231                         {
    232                             continue;
    233                         }
    234                         else
    235                         {
    236                             Regex reg = new Regex(@".exe$");
    237                             bool match = reg.IsMatch(fi.FullName.ToString());
    238                             if (match)
    239                             {
    240                                 exeLists.Add(fi.FullName.ToString());
    241                                 statusinfo = string.Format(@"Find file '{0}'", fi.FullName.ToString());                                
    242                             }
    243                         }
    244                     }
    245                 }
    246             }
    247             catch { }
    248             return exeLists;
    249         }
    250         private void ExcuteTestCase(string filename, StreamWriter sw, string expectedpath, string expectedCopyyear)
    251         {
    252             StringBuilder line = new StringBuilder();
    253             line.Append(filename + Convert.ToChar(9));
    254             statusinfo = string.Format(@"Checking path for {0}", filename);           
    255             bool pathPass = PathMatch(filename,expectedpath );
    256             statusinfo = string.Format(@"Checking EULA for {0}", filename);
    257             bool eulaPass = EULAMath(filename,expectedCopyyear );
    258             statusinfo = string.Format(@"Checking Codesign for {0}", filename);
    259             bool codeSign = (new CheckTrust()).isCodeSign(filename);
    260             if (pathPass)
    261             {
    262                 line.Append("Pass" + Convert.ToChar(9));
    263             }
    264             else
    265                 line.Append("Fail" + Convert.ToChar(9));
    266             if (eulaPass)
    267             {
    268                 line.Append("Pass" + Convert.ToChar(9));
    269             }
    270             else
    271                 line.Append("Fail" + Convert.ToChar(9));
    272             if (codeSign)
    273             {
    274                 line.Append("Pass" + Convert.ToChar(9));
    275             }
    276             else
    277             {
    278                 line.Append("Fail" + Convert.ToChar(9));
    279             }
    280             sw.WriteLine(line);
    281 
    282         }
    283 
    284         private void Form1_Load(object sender, EventArgs e)
    285         {
    286             VCSBrowser1.Navigate(@"http://vcs/request.aspx");
    287         }
    288 
    289         private void VCSBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    290         {
    291             VCSBrowser1.Document.GetElementById("txt_contact").InnerText = @"v-qixue";
    292         }
    293 
    294         private void bt_Extract_Click(object sender, EventArgs e)
    295         {
    296             HelpRAR rarhelp = new HelpRAR();           
    297             string buildforVCS = "";
    298             string folder = tb_Folder.Text.Trim();
    299             if (!Directory.Exists(folder))
    300             {
    301                 MessageBox.Show("!Dirctory not exist""Err", MessageBoxButtons.OK, MessageBoxIcon.Error);
    302                 return;
    303             }
    304             DirectoryInfo di = new DirectoryInfo(folder);
    305             ArrayList al = new ArrayList();
    306             al = Scan_Directory(di);
    307             string allfileName = "";
    308             foreach (var item in al)
    309             {
    310                 if (item.ToString().ToLower().Contains("allfiles.exe"))
    311                 {
    312                     allfileName = item.ToString();
    313                     break;
    314                 }
    315             }
    316             statusinfo = string.Format(@"Extracting {0}", allfileName);
    317             del_ExtraxctAllfiles del = new del_ExtraxctAllfiles(rarhelp.rarExtract);
    318             IAsyncResult ar = del.BeginInvoke(allfileName, out buildforVCS, new AsyncCallback(returnResult), del);
    319             //rarhelp.rarExtract(allfileName, out buildforVCS);
    320             VCSBrowser1.Document.GetElementById("txt_description").InnerText = allfileName.ToString();
    321             VCSBrowser1.Document.GetElementById("txt_contact").InnerText = tb_VCSemail .Text .Trim ();
    322             progressBar1.Value = progressBar1.Maximum / 4;
    323         }
    324 
    325         public void returnResult(IAsyncResult ar)
    326         {
    327             string buildforVCS = string.Empty;
    328             del_ExtraxctAllfiles del = (del_ExtraxctAllfiles)ar.AsyncState;
    329             bool success=del.EndInvoke(out buildforVCS, ar);           
    330             MessageBox.Show("Extraction Process finished");
    331             if (success)
    332             {
    333                 statusinfo = string.Format(@"Submitting {0} to VCS", buildforVCS);
    334 
    335                 del_SubmitToVCS d_sub = new del_SubmitToVCS(submitToVCS);
    336                 Invoke(d_sub, new object[] { buildforVCS });
    337             }
    338             else
    339                 statusinfo = "No files were extracted";
    340         }
    341 
    342         public void submitToVCS(string build)
    343         {
    344             VCSBrowser1.Document.GetElementById("txt_path").InnerText = build;
    345             VCSBrowser1.Document.GetElementById("btn_submit_asp").InvokeMember("click");
    346             statusinfo = string.Format(@"Submited file {0} to VCS", build );
    347             progressBar1.Value = progressBar1.Maximum;
    348         }
    349 
    350         private void label5_Click(object sender, EventArgs e)
    351         {
    352             if (folderBrowserDialog1.ShowDialog() != DialogResult.Cancel)
    353             {
    354                 tb_Folder.Text = folderBrowserDialog1.SelectedPath.Trim();
    355             }
    356         }
    357 
    358         private void bt_VCS_AllFileEXE_Click(object sender, EventArgs e)
    359         {
    360             string folder = tb_Folder.Text.Trim();
    361             DirectoryInfo di = new DirectoryInfo(folder);
    362             ArrayList al = new ArrayList();
    363             al = Scan_Directory(di);
    364             string allfileName = "";
    365             foreach (var item in al)
    366             {
    367                 if (item.ToString().ToLower().Contains("allfiles.exe"))
    368                 {
    369                     allfileName = item.ToString();
    370                     break;
    371                 }
    372             }
    373             VCSBrowser1.Document.GetElementById("txt_description").InnerText = allfileName.ToString();
    374             VCSBrowser1.Document.GetElementById("txt_contact").InnerText = tb_VCSemail.Text.Trim();
    375         }
    376     }
    377 }

    HelpRAR:

    代码
      1 using System;
      2 using System.Net;
      3 using System.Collections.Generic;
      4 using System.IO;
      5 using System.Text;
      6 using System.Text.RegularExpressions;
      7 using System.Diagnostics;
      8 using System.Configuration ;
      9 
     10 namespace CloudCDTool
     11 {
     12     class HelpRAR
     13     {
     14        
     15         public string rar = ConfigurationManager.AppSettings["Rar"].ToString();
     16         public string rarInfo(string filename)
     17         { 
     18             string info = string.Empty;
     19             StringBuilder theResult = new StringBuilder();
     20             ProcessStartInfo P_rar = new ProcessStartInfo(rar );
     21             P_rar.CreateNoWindow = true;
     22             P_rar.RedirectStandardInput = true;
     23             P_rar.RedirectStandardOutput = true;
     24             P_rar.UseShellExecute = false;
     25             P_rar.Arguments = string.Format(" cw \"{0}", filename);
     26 
     27             Process p = Process.Start(P_rar);
     28             StreamReader reader = p.StandardOutput;
     29             string line = reader.ReadLine();
     30             while (!reader.EndOfStream)
     31             {
     32                 theResult.AppendLine(line);
     33                 line = reader.ReadLine();
     34             }
     35             theResult.AppendLine(line);
     36             info = theResult.ToString();
     37             return info;
     38         }
     39 
     40         public string defaulPath(string filename)
     41         {
     42             string results = string.Empty;
     43             string comments = rarInfo(filename);
     44             string pattern = @"\w\:\\[\w\\\d ]+";
     45             MatchCollection mc = Regex.Matches(comments, pattern);
     46             if (mc.Count > 0)
     47             {
     48                 results = mc[0].Value.ToString();
     49             }
     50             return results;
     51         }
     52 
     53         //Share Folder :  net share auto=d:\autotool /grant:everyone,full
     54         public bool rarExtract(string filename,out string buildPath)
     55         {
     56             string info = string.Empty;
     57             string d_path = defaulPath(filename);
     58             bool success = true;
     59             string shareFolder=d_path .Substring (d_path.LastIndexOf (@"\")+1);
     60             string VCSFolder = string.Format(@"c:\VCSFolder\{0}", shareFolder);
     61             if (Directory.Exists(VCSFolder))
     62             {
     63                 try
     64                 {
     65                     Directory.Delete(VCSFolder, true);
     66                 }
     67                 catch { }
     68             }
     69             StringBuilder theResult = new StringBuilder();
     70             ProcessStartInfo P_rar = new ProcessStartInfo(rar);
     71             P_rar.CreateNoWindow = true;
     72             P_rar.RedirectStandardInput = true;
     73             P_rar.RedirectStandardOutput = true;
     74             P_rar.UseShellExecute = false;
     75             P_rar.Arguments = string.Format(" x -ad \"{0}\" \"{1}\\", filename, VCSFolder);
     76 
     77             Process p = Process.Start(P_rar);
     78             StreamReader reader = p.StandardOutput;
     79             string line = reader.ReadLine();
     80             while (!reader.EndOfStream)
     81             {
     82                 theResult.AppendLine(line);
     83                 line = reader.ReadLine();
     84             }
     85             theResult.Append(line);
     86             info = theResult.ToString();
     87             if (info.Contains("All OK"))
     88             {
     89                 ProcessStartInfo P_share = new ProcessStartInfo(@"net.exe");
     90                 P_share.CreateNoWindow = true;
     91                 P_share.RedirectStandardInput = true;
     92                 P_share.RedirectStandardOutput = true;
     93                 P_share.UseShellExecute = false;
     94                 P_share.Arguments = string.Format(" share {0}=\"{1}\" /grant:everyone,full", shareFolder, VCSFolder);
     95                 Process share = Process.Start(P_share);
     96 
     97                 buildPath = string.Format(@"\\{0}\{1}", Dns.GetHostName(), shareFolder);
     98                 success = true;
     99             }
    100             else
    101             {
    102                 buildPath = "";
    103                 success = false;
    104             }
    105 
    106             return success;
    107             
    108         }
    109     }
    110 }
    111 

    CheckTrust:

    代码
     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Diagnostics;
     6 using System.Configuration ;
     7 
     8 
     9 namespace CloudCDTool
    10 {
    11     class CheckTrust
    12     {
    13         string checktrust = ConfigurationManager.AppSettings["CheckTrust"].ToString();
    14         public bool isCodeSign(string filename)
    15         {
    16             bool codesigned = true;
    17             ProcessStartInfo P_code = new ProcessStartInfo(checktrust );
    18             P_code.CreateNoWindow = true;
    19             P_code.RedirectStandardInput = true;
    20             P_code.RedirectStandardOutput = true;
    21             P_code.UseShellExecute = false;
    22             P_code.Arguments = string.Format(" -v -q \"{0}",filename );
    23 
    24             Process process = new Process();
    25             process.StartInfo = P_code;
    26             process.Start();
    27             string theResult = process.StandardOutput.ReadToEnd();
    28             if(theResult .Contains  ("Failed"))
    29             {
    30                 codesigned = false;
    31             }
    32             else if (theResult.Contains ("Succeeded"))
    33             {
    34                 codesigned = true;
    35             }
    36             else
    37             {
    38                 codesigned = false;
    39             }
    40             return codesigned;
    41         }
    42     }
    43 }
    44 
  • 相关阅读:
    查看java代码,命令,ctrl+r
    JVM调优
    springboot线程池
    jpa
    复制java对象,jpa,save
    springboot添加切面
    gunicorn 实现 gevent 多线程
    经典算法
    python-生僻字转拼音
    HTML介绍
  • 原文地址:https://www.cnblogs.com/qixue/p/1874960.html
Copyright © 2020-2023  润新知