using System; using System.Collections.Generic; using System.Windows.Forms; using k3Login; using System.Data.SqlClient; using System.Threading; using System.Data; using System.IO; namespace CBCalcSys { static class Program { /// <summary> /// 应用程序的主入口点。 /// </summary> [STAThread] public static void Main() { //原程序入口 //验证通过 bool runone; System.Threading.Mutex run = new System.Threading.Mutex(true, "K/3Help", out runone); if (runone) { run.ReleaseMutex(); //现在程序入口 loadMain(); } else { loadMain(); } } private static IniFiles ini = new IniFiles("config.ini"); /// <summary> /// 加载帐套 /// </summary> /// <param name="uesrNameTemp"></param> /// <param name="login1"></param> public static void loadMain() { string[] uesrNameTemp = null; ClsLoginClass login1 = new ClsLoginClass(); if (login1.CheckLogin()) { //Thread.Sleep(1000); try { string connString = getConnection(login1.PropsString); //获得K3连接字符串 string conn = login1.PropsString; //ini.WriteString("链接字符串", "wid", conn); //MessageBox.Show(conn); //ini.WriteString("链接字符串", "wid1", connString); uesrNameTemp = login1.PropsString.Split(';');//分割字符串 uesrNameTemp[5] = uesrNameTemp[5].Substring(0, uesrNameTemp[5].Length - 1); DBHelper.InitConn(connString); //初始化连接 DBHelper.cyName = getUser(uesrNameTemp[6]); //获得用户名 //ini.WriteString("链接字符串", "wid", connString); connString = uesrNameTemp[4] + ";" + uesrNameTemp[5] + ";" + uesrNameTemp[2] + ";" + uesrNameTemp[3]; //获得连接字符串 DBHelper.strConn = connString; DBHelper.conn = new SqlConnection(connString); //连接初始化 Application.Run(new MainForm()); } catch (Exception ex) { throw new Exception(ex.ToString()); }finally{ Application.Run(new MainForm()); } } } /// <summary> /// 获得次数 /// </summary> private static bool getTime() { DBHelper.JieMi(DBHelper.strurl, @"d:\1-1.lcl"); bool vali = false; string sql = string.Format("select Fnum,Fdate from t_key where FitemID=1"); DataTable dt=DBHelper.QueryOle(sql).Tables[0]; DBHelper.Fnum = Convert.ToInt32(dt.Rows[0][0]); DBHelper.FDate = Convert.ToDateTime(dt.Rows[0][1]); sql = "select getDate()"; DBHelper.FSDate = Convert.ToDateTime(DBHelper.ExecuteScalar(sql)); DBHelper.Fnum--; if (DBHelper.Fnum < 10 || DBHelper.FSDate > DBHelper.FDate) { vali= false; }else{ sql = string.Format("update t_key set FNum=" + DBHelper.Fnum +" where FitemID=1"); DBHelper.DoUpdate1(sql); vali=true; } DBHelper.JiaMi(DBHelper.strurl, @"d:\1-1.lcl"); return vali; } /// <summary> /// 获得连接字符串 /// </summary> /// <param name="cnStr"></param> /// <returns></returns> public static string getConnection(string cnStr) { int i, j; i = cnStr.IndexOf('{')+1; j = cnStr.IndexOf('}'); cnStr = cnStr.Substring(i, j - i); return cnStr; } /// <summary> /// 获得SQLConnection连接字符串 /// </summary> /// <param name="cnStr"></param> /// <returns></returns> public static string getConnection1(string cnStr) { int i, j; i = cnStr.IndexOf(';') + 1; j=cnStr.Length; cnStr = cnStr.Substring(47, j - 47); string str1 = cnStr.Substring(0,24); string str2 = cnStr.Substring(25); cnStr = str2+";"+ str1; return cnStr; } /// <summary> /// 获得登录的用户名 /// </summary> /// <param name="cnStr"></param> /// <returns></returns> private static string getName(string cnStr) { int i, j; i = cnStr.IndexOf('}'); string str1 = cnStr.Substring(i+11); i = str1.IndexOf(';'); str1 = str1.Substring(0,i); return str1; } /// <summary> /// 获取用户名 /// </summary> /// <param name="cnStr"></param> /// <returns></returns> private static string getUser(string cnStr) { string str1 = cnStr.Substring(9); return str1; } /// <summary> /// 获得会计期间 及其年月 /// </summary> private static void getDate() { string sql = "select fvalue from t_systemprofile where (fkey='CurrentPeriod' and fcategory ='IC') or (fcategory ='IC' and fkey='CurrentYear') order by fvalue"; DataTable dt = DBHelper.Query(sql).Tables[0]; DBHelper.dMonth=dt.Rows[0][0].ToString(); DBHelper.dYear = dt.Rows[1][0].ToString(); sql = "select FStartDate,FEndDate from T_PeriodDate where FPeriod=" + DBHelper.dMonth + " and fyear=" + DBHelper.dYear + ""; dt = DBHelper.Query(sql).Tables[0]; DBHelper.fromDate = dt.Rows[0][0].ToString(); DBHelper.toDate = dt.Rows[0][1].ToString(); } /* * 查看帐套某月始末日期 * select FStartDate,FEndDate from T_PeriodDate where FPeriod=12 and fyear=2011 * * '账套名称 Rs1.Open "select fvalue from t_systemprofile where fcategory ='General' and fkey='CompanyName'", Public_cn If Rs1.RecordCount > 0 Then Pub_CompanyName = Trim(Rs1.Fields("fvalue")) End If '会计年度 Set Rs1 = Nothing Rs1.Open "select fvalue from t_systemprofile where fcategory ='IC' and fkey='CurrentYear'", Public_cn If Rs1.RecordCount > 0 Then Pub_CurrentYear = Trim(Rs1.Fields("fvalue")) End If '会计期间 Set Rs1 = Nothing Rs1.Open "select fvalue from t_systemprofile where fcategory ='IC' and fkey='CurrentPeriod'", Public_cn If Rs1.RecordCount > 0 Then Pub_CurrentPeriod = Trim(Rs1.Fields("fvalue")) End If */ } }
using System; using System.Collections.Generic; using System.Text; using ADODB; using System.Data.SqlClient; using System.Windows.Forms; using System.Data; using System.IO; using System.Security.Cryptography; using System.Data.OleDb; using System.Collections; namespace CBCalcSys { class DBHelper { public static int Fnum = 0;//软件可用的次数 public static DateTime FDate = Convert.ToDateTime("2050-03-02"); public static DateTime FSDate = System.DateTime.Now; public static Recordset rs=new Recordset(); public static ADODB.Connection connDB = new ADODB.Connection(); public static string strConn=""; public static SqlConnection conn = null; //数据库连接字符串 public static string strCPNum=null; //产成品代码 public static string cyName = null; //公司名称 public static bool load = false; //判断是否加载信息 public static string SearchSql = "";//判断条件 public static bool valiRun = false;//判断程序运行 public static string fromDate = ""; public static string toDate = ""; public static string dYear = ""; public static string dMonth = ""; public static string strurl = AppDomain.CurrentDomain.SetupInformation.ApplicationBase + @"\Inter.dll"; public static string strtourl = AppDomain.CurrentDomain.SetupInformation.ApplicationBase + @"\linshi.dll"; public static string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|Inter.dll;Jet OLEDB:Database Password=whwdgjlclong"; public static OleDbConnection connection = new OleDbConnection(connectionString); public static string[] vsling = new string[32]; public static bool valiLoading = false;//判断程序运行 /// <summary> /// 解密判断 /// </summary> /// <returns></returns> public static int JieMiPro() { int m = -1; bool projectlist = File.Exists(strurl); if (projectlist == true) { try { JieMi(strurl, strtourl); m = 1; } catch { JiaMi(strurl, strtourl); JieMi(strurl, strtourl); m = 1; } } else { m = -1; } return m; } /// <summary> /// 加密判断 /// </summary> /// <returns></returns> public static int JiaMiPro() { int m = -1; bool projectlist = File.Exists(strurl); if (projectlist == true) { try { string str = "select * from tab_LineType"; Query(str); JiaMi(strurl, strtourl); m = 1; } catch { JieMi(strurl, strtourl); JiaMi(strurl, strtourl); m = 1; } } else { m = -1; } return m; } #region 新加密解密 private const ulong FC_TAG = 0xFC010203040506CF; private const int BUFFER_SIZE = 128 * 1024; /// <summary> /// 检验两个Byte数组是否相同 /// </summary> /// <param name="b1">Byte数组</param> /// <param name="b2">Byte数组</param> /// <returns>true-相等</returns> private static bool CheckByteArrays(byte[] b1, byte[] b2) { if (b1.Length == b2.Length) { for (int i = 0; i < b1.Length; ++i) { if (b1[i] != b2[i]) return false; } return true; } return false; } /// <summary> /// 创建Rijndael SymmetricAlgorithm /// </summary> /// <param name="password">密码</param> /// <param name="salt"></param> /// <returns>加密对象</returns> private static SymmetricAlgorithm CreateRijndael(string password, byte[] salt) { PasswordDeriveBytes pdb = new PasswordDeriveBytes(password, salt, "SHA256", 1000); SymmetricAlgorithm sma = Rijndael.Create(); sma.KeySize = 256; sma.Key = pdb.GetBytes(32); sma.Padding = PaddingMode.PKCS7; return sma; } /// <summary> /// 加密文件随机数生成 /// </summary> private static RandomNumberGenerator rand = new RNGCryptoServiceProvider(); /// <summary> /// 生成指定长度的随机Byte数组 /// </summary> /// <param name="count">Byte数组长度</param> /// <returns>随机Byte数组</returns> private static byte[] GenerateRandomBytes(int count) { byte[] bytes = new byte[count]; rand.GetBytes(bytes); return bytes; } /// <summary> /// 加密文件 /// </summary> /// <param name="inFile">待加密文件</param> /// <param name="outFile">加密后输入文件</param> /// <param name="password">加密密码</param> public static void EncryptFile(string inFile, string outFile) { string password = "123"; using (FileStream fin = File.OpenRead(inFile), fout = File.OpenWrite(outFile)) { long lSize = fin.Length; // 输入文件长度 int size = (int)lSize; byte[] bytes = new byte[BUFFER_SIZE]; // 缓存 int read = -1; // 输入文件读取数量 int value = 0; // 获取IV和salt byte[] IV = GenerateRandomBytes(16); byte[] salt = GenerateRandomBytes(16); // 创建加密对象 SymmetricAlgorithm sma = CreateRijndael(password, salt); sma.IV = IV; // 在输出文件开始部分写入IV和salt fout.Write(IV, 0, IV.Length); fout.Write(salt, 0, salt.Length); // 创建散列加密 HashAlgorithm hasher = SHA256.Create(); using (CryptoStream cout = new CryptoStream(fout, sma.CreateEncryptor(), CryptoStreamMode.Write), chash = new CryptoStream(System.IO.Stream.Null, hasher, CryptoStreamMode.Write)) { BinaryWriter bw = new BinaryWriter(cout); bw.Write(lSize); bw.Write(FC_TAG); // 读写字节块到加密流缓冲区 while ((read = fin.Read(bytes, 0, bytes.Length)) != 0) { cout.Write(bytes, 0, read); chash.Write(bytes, 0, read); value += read; } // 关闭加密流 chash.Flush(); chash.Close(); // 读取散列 byte[] hash = hasher.Hash; // 输入文件写入散列 cout.Write(hash, 0, hash.Length); // 关闭文件流 cout.Flush(); cout.Close(); } } } /// <summary> /// 解密文件 /// </summary> /// <param name="inFile">待解密文件</param> /// <param name="outFile">解密后输出文件</param> /// <param name="password">解密密码</param> public static void DecryptFile(string inFile, string outFile) { string password = "123"; // 创建打开文件流 using (FileStream fin = File.OpenRead(inFile), fout = File.OpenWrite(outFile)) { int size = (int)fin.Length; byte[] bytes = new byte[BUFFER_SIZE]; int read = -1; int value = 0; int outValue = 0; byte[] IV = new byte[16]; fin.Read(IV, 0, 16); byte[] salt = new byte[16]; fin.Read(salt, 0, 16); SymmetricAlgorithm sma = CreateRijndael(password, salt); sma.IV = IV; value = 32; long lSize = -1; // 创建散列对象, 校验文件 HashAlgorithm hasher = SHA256.Create(); using (CryptoStream cin = new CryptoStream(fin, sma.CreateDecryptor(), CryptoStreamMode.Read), chash = new CryptoStream(System.IO.Stream.Null, hasher, CryptoStreamMode.Write)) { // 读取文件长度 BinaryReader br = new BinaryReader(cin); lSize = br.ReadInt64(); ulong tag = br.ReadUInt64(); if (FC_TAG != tag) throw new CryptoHelpException("文件被破坏"); long numReads = lSize / BUFFER_SIZE; long slack = (long)lSize % BUFFER_SIZE; for (int i = 0; i < numReads; ++i) { read = cin.Read(bytes, 0, bytes.Length); fout.Write(bytes, 0, read); chash.Write(bytes, 0, read); value += read; outValue += read; } if (slack > 0) { read = cin.Read(bytes, 0, (int)slack); fout.Write(bytes, 0, read); chash.Write(bytes, 0, read); value += read; outValue += read; } chash.Flush(); chash.Close(); fout.Flush(); fout.Close(); byte[] curHash = hasher.Hash; // 获取比较和旧的散列对象 byte[] oldHash = new byte[hasher.HashSize / 8]; read = cin.Read(oldHash, 0, oldHash.Length); if ((oldHash.Length != read) || (!CheckByteArrays(oldHash, curHash))) throw new CryptoHelpException("文件被破坏"); } if (outValue != lSize) throw new CryptoHelpException("文件大小不匹配"); } } /// <summary> /// 加密方法 /// </summary> /// <param name="fromUrl">要加密的文件地址</param> /// <param name="toUrl">临时地址</param> public static void JiaMi(string fromUrl, string toUrl) { //执行文件加密 try { EncryptFile(fromUrl, toUrl); File.Delete(fromUrl); File.Move(toUrl, fromUrl); } catch (Exception) { //throw; } finally { File.Delete(toUrl); } } /// <summary> /// 解密算法 /// </summary> /// <param name="fromUrl">要解密的文件地址</param> /// <param name="toUrl">临时地址</param> public static void JieMi(string fromUrl, string toUrl) { try { //解密文件 DecryptFile(fromUrl, toUrl); File.Delete(fromUrl); File.Move(toUrl, fromUrl); } catch (Exception) { //throw; } finally { File.Delete(toUrl); } } #endregion public static void InitConn(string cnStr) { connDB.CursorLocation = ADODB.CursorLocationEnum.adUseClient; connDB.ConnectionString = cnStr; connDB.Open(); } public static void CloseConn() { connDB.Close(); } /// <summary> /// 测试是否存在字段 /// </summary> public static void TestConn() { Object j; try { connDB.Execute("Alter table t_ICItemCore add FjsPrice decimal(18, 10),FcbPrice decimal(18, 10)", out j, -1); } catch (Exception ex) { //MessageBox.Show(ex.Message); } } /// <summary> /// 保留小数位数 /// </summary> /// <returns></returns> public static string getNumP(string str,int j) { decimal strN=0; try { strN = Convert.ToDecimal(str); strN = Math.Round(strN, j); } catch (Exception) { } return strN.ToString(); } /// <summary> /// 更新表 /// </summary> /// <param name="myConn">连接SQLConnection</param> /// <param name="sql">SQL语句</param> /// <param name="myTableName">表名称</param> /// <param name="ds1"></param> /// <returns></returns> public static DataSet SelectSqlSrvRows(string sql, DataSet ds1) { DataSet ds = new DataSet(); try { SqlDataAdapter myDataAdapter = new SqlDataAdapter(); myDataAdapter.SelectCommand = new SqlCommand(sql, conn); SqlCommandBuilder cb = new SqlCommandBuilder(myDataAdapter); conn.Open(); myDataAdapter.Fill(ds, "ds"); myDataAdapter.Update(ds1, "ds"); } catch (Exception ex) { throw new Exception(ex.Message); } finally { conn.Close(); } return ds; } /// <summary> /// 执行查询语句,返回DataSet /// </summary> /// <param name="SQLString">查询语句</param> /// <returns>DataSet</returns> public static DataSet Query(string SQLString) { DataSet ds = new DataSet(); try { conn.Open(); SqlDataAdapter command = new SqlDataAdapter(SQLString, conn); command.Fill(ds, "ds"); } catch (System.Data.OleDb.OleDbException ex) { throw new Exception(ex.Message); } finally { conn.Close(); } return ds; } /// <summary> /// 执行查询语句,返回int /// </summary> /// <param name="SQLString">查询语句</param> /// <returns>相应数目</returns> public static object ExecuteScalar(string SQLString) { object num = 0; try { conn.Open(); SqlCommand command = new SqlCommand(SQLString, conn); num = (object)command.ExecuteScalar(); } catch (System.Data.OleDb.OleDbException ex) { throw new Exception(ex.Message); } finally { conn.Close(); } return num; } /// <summary> /// "更新"数据库 /// </summary> /// <param name="sql"></param> /// <returns></returns> public static bool DoUpdate(string sql,OleDbConnection conn) { //执行文件解密 OleHelperL.JieMi(strurl, @"d:\1-1.lcl"); OleDbCommand comm = new OleDbCommand(sql, conn); try { conn.Open(); int result = comm.ExecuteNonQuery(); if (result == 1) { return true; } } catch (Exception ex) { //throw new Exception(ex.Message); } finally { conn.Close(); //执行文件加密 OleHelperL.JiaMi(strurl, @"d:\1-1.lcl"); } return false; } /// <summary> /// 执行查询语句,返回DataSet /// </summary> /// <param name="SQLString">查询语句</param> /// <returns>DataSet</returns> public static DataSet QueryOle(string SQLString) { DataSet ds = new DataSet(); try { connection.Open(); OleDbDataAdapter command = new OleDbDataAdapter(SQLString, connection); command.Fill(ds, "ds"); } catch (System.Data.OleDb.OleDbException ex) { throw new Exception(ex.Message); } finally { connection.Close(); } return ds; } /// <summary> /// "更新"数据库 /// </summary> /// <param name="sql"></param> /// <returns></returns> public static bool DoUpdate1(string sql) { //执行文件解密 OleDbCommand comm = new OleDbCommand(sql, connection); try { connection.Open(); int result = comm.ExecuteNonQuery(); if (result == 1) { return true; } } catch (Exception ex) { throw new Exception(ex.Message); } finally { connection.Close(); } return false; } } }