通常我们做一个Web应用程序的时候都需要登录,登录就要输入用户名和登录密码,并且,用户名和登录密码都是明文传输的,这样就有可能在中途被别人拦截,尤其是在网吧等场合。 这里顺带一个小插曲,我以前有家公司,办公室装修时候安排的网口相对较少,不太够用,于是我和另外一个同事使用了一个hub来共享一个网口,这就导致了很有趣的现象:任何他的网络包我都能抓得到,当然了,我的他也能抓得到。这是不是有很大的安全隐患了?我有可能在不经意间会泄漏自己的密码。 所以,很多安全要求较高的网站都不会明文传输密码,它们会使用https来确保传输过程的安全,https是用证书来实现的,证书来自于证书颁发机构,当然了,你也可以自己造一张证书,但这样别人访问你的网站的时候还是会遇到麻烦,因为你自己造的证书不在用户浏览器的信任范围之内,你还得在用户浏览器上安装你的证书,来让用户浏览器相信你的网站,很多用户并不知道如何操作,就算会操作,也能也不乐意干;另一种选择是你向权威证书颁发机构申请一张证书,但这样有一定的门槛,还需要付费,也不是我们乐意干的事。 所以,我打算自己实现一个密码加密传输方法。 这里使用了RSA非对称加密算法,对称加密也许大家都已经很熟悉,也就是加密和解密用的都是同样的密钥,没有密钥,就无法解密,这是对称加密。而非对称加密算法中,加密所用的密钥和解密所用的密钥是不相同的:你使用我的公钥加密,我使用我的私钥来解密;如果你不使用我的公钥加密,那我无法解密;如果我没有私钥,我也没法解密。 我设计的这个登录密码加密传输方法的原理图如下: 首先,先演练一下非对称加密:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
static void Main(string[] args){ //用于字符串和byte[]之间的互转 UTF8Encoding utf8encoder = new UTF8Encoding(); //产生一对公钥私钥 RSACryptoServiceProvider rsaKeyGenerator = new RSACryptoServiceProvider(1024); string publickey = rsaKeyGenerator.ToXmlString(false); string privatekey = rsaKeyGenerator.ToXmlString(true); //使用公钥加密密码 RSACryptoServiceProvider rsaToEncrypt = new RSACryptoServiceProvider(); rsaToEncrypt.FromXmlString(publickey); string strPassword = "@123#abc$"; Console.WriteLine("The original password is: {0}", strPassword); byte[] byEncrypted = rsaToEncrypt.Encrypt(utf8encoder.GetBytes(strPassword), false); Console.Write("Encoded bytes: "); foreach (Byte b in byEncrypted) { Console.Write("{0}", b.ToString("X")); } Console.Write("\n"); Console.WriteLine("The encrypted code length is: {0}", byEncrypted.Length); //解密 RSACryptoServiceProvider rsaToDecrypt = new RSACryptoServiceProvider(); rsaToDecrypt.FromXmlString(privatekey); byte[] byDecrypted = rsaToDecrypt.Decrypt(byEncrypted, false); string strDecryptedPwd = utf8encoder.GetString(byDecrypted); Console.WriteLine("Decrypted Password is: {0}", strDecryptedPwd); } |
大家可以清楚看到,密码被加密成128字节长度的密文,为什么是固定128字节呢?这是因为我们的RSACryptoServiceProvider默认生成的key的长度是1024,即1024位的加密,所以不管你要加密的密码有多长,它生成的密文的长度肯定是128字节,也因为这样,密码的长度是有限制的,1024位的RSA算法,只能加密大约100个字节长度的明文,要提高可加密的明文的长度限制,就得增加key的长度,比如把key改到2048位,这样能加密的明文的长度限制也就变为大概200出头这样……还是太少啊!而且这样会带来加密速度的显著下降,RSA本来就很慢……是的,比同没有长度限制的对称加密,这种非对称加密的限制可真多,即便是200个字符,又能传输什么东西呢?——密码!这个就够了,传输完密码之后,我们就使用对称加密,所以,RSA往往是用来“协商”一个对称加密的key的。 接下去,真正的难点在于用javascript实现一个和.net的RSA兼容的算法。密码学,对我来说真像天书一般,每次我一看就头大,这个工作是没办法自己做的了,只能到网上找,那是相当的费力啊,找到许多js的RSA实现,但都和.net的这套东西不兼容,最后还是功夫不负有心人,终于找到了一套。不多说,上代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
<html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>RSA Login Test</title> <script src="Scripts/jquery-1.4.1.js" type="text/javascript"></script> <script src="Scripts/jQuery.md5.js" type="text/javascript" ></script> <script src="Scripts/BigInt.js" type="text/javascript"></script> <script src="Scripts/RSA.js" type="text/javascript"></script> <script src="Scripts/Barrett.js" type="text/javascript"></script> <script type="text/javascript"> function cmdEncrypt() { setMaxDigits(129); var key = new RSAKeyPair("<%=strPublicKeyExponent%>", "", "<%=strPublicKeyModulus%>"); var pwdMD5Twice = $.md5($.md5($("#txtPassword").attr("value"))); var pwdRtn = encryptedString(key, pwdMD5Twice); $("#encrypted_pwd").attr("value", pwdRtn); $("#formLogin").submit(); return; } </script> </head> <body> <form action="Default.aspx" id="formLogin" method="post"> <div> <div> User Name: </div> <div> <input id="txtUserName" name="txtUserName" value="<%=postbackUserName%>" type="text" maxlength="16" /> </div> <div> Password: </div> <div> <input id="txtPassword" type="password" maxlength="16" /> </div> <div> <input id="btnLogin" type="button" value="Login" onclick="return cmdEncrypt()" /> </div> </div> <div> <input type="hidden" name="encrypted_pwd" id="encrypted_pwd" /> </div> </form> <div> <%=LoginResult%> </div> </body> </html> |
这是客户端代码,大家可以看到,基本没有什么服务器端代码,<%=postbackUserName%>用于回显输入的用户名,<%=LoginResult%>用于显示登录结果,<%=strPublicKeyExponent%>和<%=strPublicKeyModulus%>则用来告诉客户端RSA公钥。需要的javascript文件说明: jQuery.md5.js – 用于对密码进行两次md5加密;(我通常在数据库中保存的用户密码是两次MD5后的结果) BigInt.js – 用于生成一个大整型;(这是RSA算法的需要) RSA.js – RSA的主要算法; Barrett.js – RSA算法所需要用到的一个支持文件; 对于密码学,我几乎一无所知,所以没办法跟大家解释清楚RSA算法的原理,抱歉,我只知道怎么用。关于javascript中这行代码:“setMaxDigits(129);”具体表示什么我也不清楚,我只知道,把参数改为小于129的数之后会导致客户端的javascript执行进入死循环。服务器端代码也很简单:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
protected void Page_Load(object sender, EventArgs e) { LoginResult = ""; RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); if (string.Compare(Request.RequestType, "get", true)==0) { //将私钥存Session中 Session["private_key"] = rsa.ToXmlString(true); } else { bool bLoginSucceed = false; try { string strUserName = Request.Form["txtUserName"]; postbackUserName = strUserName; string strPwdToDecrypt = Request.Form["encrypted_pwd"]; rsa.FromXmlString((string)Session["private_key"]); byte[] result = rsa.Decrypt(HexStringToBytes(strPwdToDecrypt), false); System.Text.ASCIIEncoding enc = new ASCIIEncoding(); string strPwdMD5 = enc.GetString(result); if (string.Compare(strUserName, "user1", true)==0 && string.Compare(strPwdMD5, "14e1b600b1fd579f47433b88e8d85291", true)==0) bLoginSucceed = true; } catch (Exception) { } if (bLoginSucceed) LoginResult = "登录成功"; else LoginResult = "登录失败"; } //把公钥适当转换,准备发往客户端 RSAParameters parameter = rsa.ExportParameters(true); strPublicKeyExponent = BytesToHexString(parameter.Exponent); strPublicKeyModulus = BytesToHexString(parameter.Modulus); } |
用户名“user1” 密码“123456” 登录成功! 抓取http报文看看POST的“密码”: 这样的“密码”的破解就成为了理论上的可行了。:) 下面提供完整代码下载(使用VS2010开发环境):RSALoginTest 我根据博主的例子整理的:RsaDemo from:http://www.cnblogs.com/AloneSword/archive/2013/09/18/3329359.html
View DetailsSystem.Security.Cryptography 命名空间提供加密服务,包括安全的数据编码和解码,以及许多其他操作,例如散列法、随机数字生成和消息身份验证。 有关更多信息,请参见加密服务。 类 类 说明 Aes 表示高级加密标准 (AES) 的所有实现都必须从中继承的抽象基类。 AesCryptoServiceProvider 使用高级加密标准 (AES) 算法的加密应用程序编程接口 (CAPI) 实现来执行对称加密和解密。 AesManaged 提供高级加密标准 (AES) 对称算法的托管实现。 AsnEncodedData 表示 Abstract Syntax Notation One (ASN.1) 编码数据。 AsnEncodedDataCollection 表示 AsnEncodedData 对象的集合。 此类不能被继承。 AsnEncodedDataEnumerator 提供在 AsnEncodedDataCollection 对象中导航的能力。 此类不能被继承。 AsymmetricAlgorithm 表示所有非对称算法的实现都必须从中继承的抽象基类。 AsymmetricKeyExchangeDeformatter 表示所有非对称密钥交换反格式化程序均从中派生的基类。 AsymmetricKeyExchangeFormatter 表示所有非对称密钥交换格式化程序均从中派生的基类。 AsymmetricSignatureDeformatter 表示所有不对称签名反格式化程序实现均从中派生的抽象基类。 AsymmetricSignatureFormatter 表示所有不对称签名格式化程序实现均从中派生的基类。 CngAlgorithm 封装加密算法的名称。 CngAlgorithmGroup 封装加密算法组的名称。 CngKey 定义与下一代加密技术 (CNG) 对象一起使用的密钥的核心功能。 CngKeyBlobFormat 指定与 Microsoft 下一代加密技术 (CNG) 对象一起使用的密钥 BLOB 格式。 CngKeyCreationParameters 包含密钥创建的高级属性。 CngPropertyCollection 提供下一代加密技术 (CNG) 属性的强类型集合。 CngProvider 封装与下一代加密技术 (CNG) 对象一起使用的密钥存储提供程序 (KSP) 的名称。 CngUIPolicy 为用户界面 (UI) 封装可选配置参数,当您访问受保护的密钥时,下一代加密技术 (CNG) 将显示这些配置参数。 CryptoAPITransform 执行数据的加密转换。 此类不能被继承。 CryptoConfig 访问加密配置信息。 CryptographicAttributeObject […]
View Details上文NuGet学习笔记(1) 初识NuGet及快速安装使用说到NuGet相对于我们最重要的功能是能够搭建自己的NuGet服务器,实现公司内部类库的轻松共享更新。在安装好NuGet扩展后,我们已经能够通过NuGet轻松下载自己需要的类库,下面来说一说如何将自己的项目类库进行打包发布 使用图形界面打包自己的类库 NuGet可以使用NuGet.exe在命令行下进行类库打包,也可以使用图形化界面进行打包,估计很多朋友都和我一样对不熟悉的命令行有些感冒,所以在此仅讲述下使用图形化界面进行类库打包 1. 首先下载 包包管理器 NuGetPackageExplorer,顾名思义,包包管理器可以用来创建新的类库包,也可以浏览已经创建好的类库包 2. 下载完成后,双击 NuGetPackageExplorer.application 进行安装,安装完成后会在桌面上生成一个NuGet Package Explorer 的快捷方式 3. 双击NuGet Package Explorer出现启动界面,选择Create a new package(Ctrl+N)创建一个新包 4. 选择菜单 Edit > Edit Package Metadata (或者 CTRL + K) 编辑包包信息 这里可以编辑类库包的信息和添加类库、程序集的引用解释下几个比较重要的字段 Id:用于定位类库包的唯一标示,如在命令行下执行 Install-Package MyPackage 这里的MyPackage就是包包的Id值 Version:类库的版本号,这里建议和程序集的真实版本号保持一致,以免发生混淆 Dependencies:此类库依赖的程序集,根据实际情况添加依赖类库的Id和版本号,若无留空即可,这里需要注意下填写的依赖类库需要在NuGet服务器上能找到,否则无法完成自动引用添加 Framework assemblies:依赖的Framework 程序集,根据实际需要选择即可,一般无需设置 除以上四项以外其他属性根据实际情况修改即可,若自己用不修改也中,不过为了使用方便还是建议把类库描述(Description)填写下 5. 编辑好包包信息后接下来添加DLL到包包中 可以选择 右键-->Add Existinng File… 选择dll添加,也可以直接拖拽DLL到 Package contents 窗口,此例选择拖拽方式 直接拖拽dll到窗口后,会出现提示:是否将 Winista.HtmlParser.dll放到lib 文件夹下,一般我们选择是 6. DLL添加完成后,快捷键Ctrl + K 修改包包信息Id为Winista.HtmlParser,版本号为1.8.0 7. 信息修改和dll都添加完毕后,选择File --> Save(或Ctrl + S)将文件进行保存,默认文件名为Id + 版本号.nupkg 8. 完成保存后如需要发布到网上,选择File--> Publish…(或Ctrl + P) 默认的发布地址是官网,发布 Key需要到官网去注册一个账号,然后就可以得到,这里不在复述,若无需发布直接关闭即可 ps:这里没有讲述如何打包项目文件,一般情况下我们自己将项目文件编译成DLL然后使用图形化界面打包即可满足需求,若实际工作需要高度集成完全自动化操作可自行去研究下官方文档http://docs.nuget.org/ 添加DLL默认会添加Lib文件夹,额外的菜单上还有很多.net文件夹,src等文件夹,这些文件夹只是对文件上的一个物理上的划分而已,只是为了帮助我们做好文件分类,没有其他的用途,dll文件可以随便放置,不过为了规范还是建议按照通常习惯来放置。 from:http://kb.cnblogs.com/page/143191/
View Details关于NuGet园子里已经有不少介绍及使用经验,本文仅作为自己研究学习NuGet一个记录。 初次认识NuGet是在去年把项目升级为MVC3的时候,当时看到工具菜单多一项Library Package Manager,右键项目文件多了一项Manage Nuget Packages…,这是个神马玩意儿,当时是一头雾水,后台查了些资料才知到NuGet是 Visual Studio的一个扩展,引用dudu的话来说就是管理程序的包包,可以参考msdn上这篇文章使用 NuGet 管理项目库以及咱们博客园站长dudu写的程序员,用NuGet管理好你的类库,有些类似java中常用的maven 为什么要使用NuGet 简单的说NuGet可以是我们的工作更方便,当我们的项目里要引用到的一些库时候,比如JQuery、Newtonsoft.Json、log4net等,我们需要从网上下载这些库,然后依次拷贝到各个项目中,当有的类库有更新时又不得不再重复一遍很是繁琐 ,这时就可以考虑使用NuGet来帮我们管理和更新这些类库,而且更新类库时会自动添加类库的相关引用,方便至极。当然网上一些我们常用的类库更新频率不是很高而且即便出了新版本我们也没必要总是保持最新,故这点对我们的帮助比较有限,个人认为NuGet最大的好处在于可以搭建自己的类库服务器,想想一下吧,在一些较大些的公司里面有很多的项目,然后其中有一些是整个组,甚至整个公司通用的类库,当这些类库有更新后我们需要依次拷贝到我们的项目,甚至于有时候我们自己都搞不清楚各个项目里的版本是否一致,有时偶尔一两个项目忘了复制更新出现莫名其妙的错误,为此头疼不已,现在有了NuGet,世界从此而不同。 安装NuGet扩展 要使用NuGet首先需要安装它(在安装了MVC3的系统上已自动安装了NuGet) 1. 点击 工具-->扩展管理器(R)…-->右上角搜索框输入NuGet 2. 点击 NuGetPackage Manager 项上面的下载按钮开始下载NuGet 3. 下载完成后出现安装页面,点安装开始安装 4. 很快安装完成,然后点击关闭完成整个安装 5. 安装完后NuGet暂时不能用,需要重新启动下VS才行,重启后完毕后打开 扩展管理器(R)… 在已安装的扩展里可以看到NuGet Package Manager已经安装好了 使用NuGet下载需要的类库 1. 打开NuGet管理界面 2. 出现如下界面,可以在里面找自己想要的类库也可以在右上角搜索里面输入关键字查找自己想要的类库,找到合适自己的类库后点install进行安装 3. 这里我们选择安装Json.Net,点击安装好出现组件下载界面 4. 下载完成后会出现提示将类库安装到什么项目,这里我们选择安装到TestConsole项目 5. 安装完成后可以看到已经安装的Josn.Net显示一个已安装的小对勾 6. 打开项目引用可以看到我们刚选择的类库Newtonsoft.Json已经自动添加到项目引用中 使用命令行管理你的类库 1. NuGet提供了命令行安装方法,在菜单中选择Package Manager Console,打开命令行控制台 2. 出现NuGet控制台界面,默认类库源(Package source)为官方站点,也可以指向自己搭建的本地或内网站点,Default project表示默认将下载的类库添加到那个项目的引用中 3. NuGet控制台有几个常用命令 Get-Package 获取当前项目已经安装的类库 Install-Package 安装指定类库,命令格式如下:Install-Package 类库ID,如Install-Package Newtonsoft.Json 这里需要注意的是类库的ID是唯一的,指向命令后会自动搜索指定类库源里指定ID类库,若找到则自动下载并添加引用,找不到则会出现找不到类库的提示 Uninstall-Package 卸载指定类库,命令格式如下:Uninstall-Package 类库ID,如Uninstall-Package Newtonsoft.Json Update-Package 更新指定类库,命令格式如下:Update-Package 类库ID,如Update-Package Newtonsoft.Json ps:刚开始不熟悉时可以使用界面方式下载和更新类库,有一定经验后还是建议使用控制台添加、更新类库这样很方便,由于使用控制台需要知道类库的准确ID,可以到http://www.nuget.org/packages这里去查找,把自己常用的ID记录下方便以后使用。 from:http://kb.cnblogs.com/page/143190/
View DetailsC# 程序重启计算机的方法很多,网上也有不少这方面的文章,不过很多网上提供的方法在某些情况下无法获取重启计算机的权限导致重启失败。本文对这些方法做一些简单的讨论。 作者:eaglet 网上介绍最多的两种方法分别是:
1 |
System.Diagnostics.Process.Start(<span class="str">"shutdown"</span>,<span class="str">@"/r"</span>); |
和
1 2 3 4 5 6 7 8 9 |
[DllImport(<span class="str">"user32.dll"</span>)] <span class="kwrd">static</span> <span class="kwrd">extern</span> <span class="kwrd">bool</span> ExitWindowsEx(ExitWindows uFlags, ShutdownReason dwReason); [STAThread] <span class="kwrd">static</span> <span class="kwrd">void</span> Main(<span class="kwrd">string</span>[] args) { ExitWindowsEx(ExitWindows.LogOff, ShutdownReason.MajorOther & ShutdownReason.MinorOther); <span class="rem">//这个语句将实现计算机注销操作 </span> } |
这两种方法在通常情况下工作是没有问题的,但在某些特殊情况下,比如桌面被其它用户锁定时就无法重启计算机。本人在实际工作中遇到过当当前屏幕被远程控制软件锁定后,我做的后台守护进程试图重启计算机,结果用上述两种方法都无法成功。分析原因,应该是远程控制软件用另外的帐号锁定了屏幕(通常应该是windows service 或者 network service),这时守护进程用当前帐号重启计算机就因为没有权限而失败。 要解决这个问题,我们必须要给进程赋予足够的权限才行,于是我在调用 ExitWindowsEx 前运行了如下代码来赋予当前进程关闭计算机权限
1 |
1 |
<span class="rem">//give current process SeShutdownPrivilege</span> |
1 |
TokPriv1Luid tp; |
1 |
1 |
IntPtr hproc = GetCurrentProcess(); |
1 |
1 |
IntPtr htok = IntPtr.Zero; |
1 |
1 |
<span class="kwrd">if</span> (!OpenProcessToken(hproc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, <span class="kwrd">ref</span> htok)) |
1 |
{ |
1 |
<span class="kwrd">throw</span> <span class="kwrd">new</span> Exception(<span class="str">"Open Process Token fail"</span>); |
1 |
} |
1 |
1 |
tp.Count = 1; |
1 |
1 |
tp.Luid = 0; |
1 |
1 |
tp.Attr = SE_PRIVILEGE_ENABLED; |
1 |
1 |
<span class="kwrd">if</span> (!LookupPrivilegeValue(<span class="kwrd">null</span>, SE_SHUTDOWN_NAME, <span class="kwrd">ref</span> tp.Luid)) |
1 |
{ |
1 |
<span class="kwrd">throw</span> <span class="kwrd">new</span> Exception(<span class="str">"Lookup Privilege Value fail"</span>); |
1 |
} |
1 |
1 |
<span class="kwrd">if</span> (!AdjustTokenPrivileges(htok, <span class="kwrd">false</span>, <span class="kwrd">ref</span> tp, 0, IntPtr.Zero, IntPtr.Zero)) |
1 |
{ |
1 |
<span class="kwrd">throw</span> <span class="kwrd">new</span> Exception(<span class="str">"Adjust Token Privileges fail"</span>); |
1 |
} |
上面代码为当前进程赋予了关闭计算机的权限。这里需要注意的是上述代码要执行成功同样需要足够的权限,通常当前进程需要以拥有至少是系统管理员权限的账户运行。如果没有足够权限,需要用程序模拟系统管理员权限,模拟其它帐号权限的问题不在本文讨论范围内。 加上如上代码后,在其他用户锁定机器后,重启计算机成功。 下面给出完整代码
1 2 |
<span class="kwrd"> using</span> System; |
1 |
<span class="kwrd">using</span> System.Collections.Generic; |
1 |
<span class="kwrd">using</span> System.Text; |
1 |
<span class="kwrd">using</span> System.Runtime.InteropServices; |
1 |
<span class="kwrd">using</span> System.Threading; |
1 |
1 |
<span class="kwrd">public</span> <span class="kwrd">class</span> ExitWindows |
1 |
{ |
1 |
<span class="preproc">#region</span> win32 api |
1 |
[StructLayout(LayoutKind.Sequential, Pack = 1)] |
1 |
1 |
<span class="kwrd">private</span> <span class="kwrd">struct</span> TokPriv1Luid |
1 |
{ |
1 |
1 |
<span class="kwrd">public</span> <span class="kwrd">int</span> Count; |
1 |
1 |
<span class="kwrd">public</span> <span class="kwrd">long</span> Luid; |
1 |
1 |
<span class="kwrd">public</span> <span class="kwrd">int</span> Attr; |
1 |
1 |
} |
1 |
1 |
[DllImport(<span class="str">"kernel32.dll"</span>, ExactSpelling = <span class="kwrd">true</span>)] |
1 |
<span class="kwrd">private</span> <span class="kwrd">static</span> <span class="kwrd">extern</span> IntPtr GetCurrentProcess(); |
1 |
1 |
[DllImport(<span class="str">"advapi32.dll"</span>, ExactSpelling = <span class="kwrd">true</span>, SetLastError = <span class="kwrd">true</span>)] |
1 |
<span class="kwrd">private</span> <span class="kwrd">static</span> <span class="kwrd">extern</span> <span class="kwrd">bool</span> OpenProcessToken(IntPtr h, <span class="kwrd">int</span> acc, <span class="kwrd">ref</span> IntPtr phtok); |
1 |
[…]
View DetailsVS2012已经全面切换到使用NuGet这个第三方开源工具来管理项目包和引用模块了,使用VS2012开发,都要装NuGet插件(官网:http://nuget.org),进官网点安装就进入了微软的下载页面,选择vs2012版本的NuGet.Tools.vsix文件,双击安装就可以了。 from:http://www.cxyclub.cn/n/20504/
View DetailsWindowsIdentity类可以获取当前执行者的身份信息 /// <summary> /// 递归搜索文件方法 /// </summary> /// <param name="path">搜索的目录</param> /// <param name="name">搜索的文件名</param> public void GetDir(string path,string name) { DirectoryInfo di = new DirectoryInfo(path); DirectorySecurity s = new DirectorySecurity(path, AccessControlSections.Access); //判断目录是否 可以访问 if (!s.AreAccessRulesProtected) { foreach (DirectoryInfo d in di.GetDirectories()) { foreach (FileInfo fi in di.GetFiles()) { if (fi.Name.Contains(name)) { txtInfo.AppendText("文件名:"+fi.Name + " 路径:" + fi.FullName + " \n"); } } GetDir(d.FullName, name); } } } } 对执行的程序设定执行身份权限 如果程序不是以管理员身份运行,操作本地文件会提示:System.UnauthorizedAccessException异常 Vista 和 Windows 7 操作系统为了加强安全,增加了 UAC(用户账户控制) 的机制,如果 UAC 被打开,用户即使是以管理员权限登录,其应用程序默认情况下也无法对系统目录,系统注册表等可能影响系统运行的设置进行写操作。这个机制大大增强了系统的安全性,但对应用程序开发者来说,我们不能强迫用户去关闭UAC,但有时我们开发的应用程序又需要以 Administrator 的方式运行,即 Win7 中 […]
View Details如果程序不是以管理员身份运行,操作本地文件会提示:System.UnauthorizedAccessException异常。 Vista 和 Windows 7 操作系统为了加强安全,增加了 UAC(用户账户控制) 的机制,如果 UAC 被打开,用户即使是以管理员权限登录,其应用程序默认情况下也无法对系统目录,系统注册表等可能影响系统运行的设置进行写操作。这个机制大大增强了系统的安全性,但对应用程序开发者来说,我们不能强迫用户去关闭UAC,但有时我们开发的应用程序又需要以 Administrator 的方式运行,即 Win7 中 以 as administrator 方式运行,那么我们怎么来实现这样的功能呢? 我们在 win7 下运行一些安装程序时,会发现首先弹出一个对话框,让用户确认是否同意允许这个程序改变你的计算机配置,但我们编写的应用程序默认是不会弹出这个提示的,也无法以管理员权限运行。本文介绍了 C# 程序如何设置来提示用户以管理员权限运行。 首先在项目中增加一个 Application Manifest File app.manifest 默认的配置如下: <?xml version="1.0" encoding="utf-8"?> <asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> <security> <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3"> <!-- UAC Manifest Options If you want to change the Windows User Account Control level replace the requestedExecutionLevel node with one of the following.<requestedExecutionLevel level="asInvoker" uiAccess="false" /> <requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> <requestedExecutionLevel level="highestAvailable" uiAccess="false" /> If you want to […]
View Details每次我安装AUTO cad2012都会提示我必须要更新安装.NET framework 4.0,但总是提示安装失败。经过反复的学习与测试,我终于知道如何处理了。 找到安装包双击安装; 接受许可条款点击安装; 安装提示双进度条,安装成功将会提示你安装成功。 安装失败是,安装进度条会变成安装回滚条,将会提示安装未完成。 解决方法:开始——运行——输入cmd——回车——在打开的窗口中输入net stop WuAuServ 开始——运行——输入%windir% 找到有个叫SoftwareDistribution的文件夹,把它重命名为SDold 开始——运行——输入cmd——回车——在打开的窗口中输入net start WuAuServ 开始——运行——输入regedit——回车 找到注册表,HKEY_LOCAL_MACHINE\SOFWARE\Microsoft\Internet Explorer下的MAIN子键,右击main后,在上面菜单中找到“编辑”--“权限”,点击后就会出现“完全控制”等字样,勾上即可放心安装。 一般使用ghost系统都会出现这种问题,由于开发系统默认的权限设置导致这种情况无发安装。 FROM:http://jingyan.baidu.com/article/00a07f3892376982d028dc2a.html
View Details————————— Microsoft Visual Studio ————————— 未能正确加载“Microsoft.VisualStudio.Editor.Implementation.EditorPackage”包。 此问题可能是由配置更改或安装另一个扩展导致的。可以通过查看文件“C:\Users\用户名\AppData\Roaming\Microsoft\VisualStudio\11.0\ActivityLog.xml”来获取详细信息。 是否继续显示此错误消息? ————————— 是(Y) 否(N) ————————— 解决方案:"Microsoft Visual Studio 2012"->"Visual Studio Tools"->"VS2012 开发人员命令提示"->输入"devenv /resetuserdata " FROM:http://www.cnblogs.com/autumn/p/3452369.html
View Details