原文www.cnblogs.com/cdts_change/archive/2010/03/04/1677338.html

临近公司的软件要完工了,最近几天一直在泉哥的带领下为我们公司的产品做IIS一键安装的程序,在这个过程中也学习到狠多有用的知识,现在拿来与大家分享一下,也顺便可以巩固一下自己的知识。

程序要求:

  • 适合于所有Microsoft操作系统,程序能自动识别操作系统的版本和型号,安装和配置对应的IIS
  • 用户只需要执行程序,便不需再做任何事情,程序的安装是静默安装,安装过程不需要用户做任何操作

首先我们知道,Windows 7 以前的操作系统,我们安装IIS都需要安装光盘。光盘里必然会有一个i386的文件夹,文件夹大概有几百兆,里面放着我们需要的IIS安装文件。以往我们 装IIS都是在控制面板中点添加程序组件,然后勾选上Internet信息服务,这时系统会自动搜索光盘中的i386文件夹,然后找到安装IIS所需要的 文件,自己安装起来,最后再提示我们安装成功。如果要卸载IIS,则用同样的操作,不同的只是把Internet信息服务前面的勾勾取消掉而已。这样一个 过程,需要用户自己做很多事情,面对许多对电脑不熟悉的用户,我们很难要求他们自己去完成这些事情,因此才有了一键安装IIS程序的诞生。其实现在已经有 很多关于一键安装IIS的软件了,有bat格式的,也有exe格式的。当然我自己的程序也是借鉴了很多网上类似程序的思路和原理,我在以后的篇幅中会尽量 都标记上别人文章的引用。

接下来我们需要分析一下如何实现程序。首先,我们的安装是不可能要光盘的,所以我们第一步是要把光盘中的i386文件夹拷贝出来。但经过分析,在 i386文件中只有少量的文件是我们在安装IIS时需要的,所以我们第二步是要从i386文件中提取出我们需要的少量文件。最后我们再通过命令行来完成我 们的IIS安装。

程序实现步骤:

  • 从光盘提取i386文件(如果是64位系统还需要提取AMD64文件)
  • 从i386(AMD64)文件找到所需的IIS安装文件
  • 执行命令行完成IIS安装

步骤上看起来很简单,但是做的时候遇到很多大大小小的问题,我想读者在做的过程中可能或多或少也会遇见跟我差不多的问题,所以详情且看下文:

我最先做测试的是32位的XP系统,首先从微软官网下载了一个原始的XP Professional系统安装文件,安装到虚拟机。然后从虚拟机中拷贝出i386的文件夹到本地。

问题1:在i386文件夹中,哪些文件才是我们装IIS需要的呢?

回答:i386文件夹中有一个iis.in_文件,这个"iis.in_"是个压缩文 件,i386中的所有文件都是经过压缩的,所以你会看见基本上所有文件的后缀名的最后一位都是"_"。而i386文件夹里面自己提供了一个叫做 expand.exe的解压缩程序,于是我们可以执行命令行,如下图:

第一个红线是被解压的文件,第二个红线是解压到的目标文件,现在我们就把iis.inf文件放在了D盘,找到文件打开来一看,里面有大量的信息,其中里面有很多文件的名字,这些文件都是在i386中能找到的,如图:

这些文件我想很可能就是我们装IIS所需要的

(因为这个文本文件名字就叫IIS.inf嘛,:-))。

因此我们下一步的工作是编一个程序,从这个已有的iis.inf文件中搜索到所有的文件名,只要这些文件名是i386里面存在的,则拷贝出来。

问题2:但是这里面的文件名太多,我们怎么查找呢?

回答:其实IIS的安装需要的文件很多,但是需要的文件后缀名类型却可以枚举,所以我们只需要通过试探出传统IIS安装过程中所需要的所有文件的后缀名,于是我们就可以编程取出inf文件中的所有与这些后缀名相符的文件名即可。代码如下:


   internal class IISManager
    {
        /// <summary>
        /// 安装文件名列表
        /// </summary>
        protected List<string> files = new List<string>();         public string OperatingSystem { get; set; }
        private string[] requiredSuffix;
        /// <summary>
        /// 需要的安装文件后缀
        /// </summary>
        protected string[] RequiredSuffix
        {
            get
            {
                if (requiredSuffix == null)
                {
                    switch (OperatingSystem)
                    {
                        case "Microsoft Windows XP":
                            requiredSuffix = new string[] { ".dll", ".ini", ".h2", ".exe", ".ocx", ".msc", ".pmc", ".sql", ".cab", ".vbs", ".hlp", ".cnt" };
                            break;
                        case "Microsoft Windows Server 2003":
                        case "Microsoft Windows Server 2003 R2":
                            requiredSuffix = new string[] { ".dll", ".ini", ".h2", ".exe", ".ocx", ".msc", ".pmc", ".sql", ".cab", ".vbs", ".hlp", ".cnt", ".wsc", ".mfl", ".mof", ".asp" };
                            break;
                    }
                }
                return requiredSuffix;
            }
            set
            {
                requiredSuffix = value;
            }
        }
        private char[] separatorChars = new char[] { ',', '|', ';', '\t', '\\', '/', ' ', '\"' };
        /// <summary>
        /// Inf文件内容分隔符
        /// </summary>
        protected char[] SeparatorChars
        {
            get { return separatorChars; }
            set { separatorChars = value; }
        }         protected string IISInfPath { get; set; }
        protected string I386PackSourcePath { get; set; }
        protected string I386BatPath { get; set; }         /// <summary>
        /// 获取IIS必需文件
        /// </summary>
        /// <param name="operatingSystem">操作系统名称</param>
        /// <param name="infPath">Inf文件路径</param>
        /// <param name="sourcePath">I386源文件路径(路径需包含\i386)</param>
        /// <param name="batPath">要生成的Bat文件路径</param>
        internal IISManager(string operatingSystem, string infPath, string sourcePath, string batPath)
        {
            this.OperatingSystem = operatingSystem;
            this.IISInfPath = infPath;
            this.I386PackSourcePath = sourcePath;
            this.I386BatPath = batPath;
        }         #region GetRequiredFiles
        /// <summary>
        /// 查找文件是否存在(包含:.DLL->.DL_或者.DLL)
        /// </summary>
        /// <param name="sourcePath">查找目标路径</param>
        /// <param name="fileName">被查找的文件名</param>
        /// <returns>返回查找到的文件路径,如果没找到返回空字符串</returns>
        private string FindFile(string sourcePath, string fileName)
        {
            if (fileName.EndsWith(".h2"))
            {
                fileName += "_";
            }
            string[] strList = Directory.GetFiles(sourcePath, fileName, SearchOption.AllDirectories);
            if (strList != null && strList.Length > )
                return strList[];
            fileName = fileName.Substring(, fileName.Length - ) + "_";
            strList = Directory.GetFiles(sourcePath, fileName, SearchOption.AllDirectories);
            if (strList != null && strList.Length > )
                return strList[];
            return "";
        }
        /// <summary>
        /// 获得IIS安装必备文件并写入Bat文件中
        /// </summary>
        internal string GetRequiredFiles()
        {
            //获取IIS必需文件
            string[] iisInfPath = File.ReadAllLines(IISInfPath);
            for (int i = ; i < iisInfPath.Length; i++)
            {
                string[] separatorList = iisInfPath[i].Split(SeparatorChars);
                for (int j = ; j < separatorList.Length; j++)
                {
                    foreach (string suffix in RequiredSuffix)
                    {
                        if (separatorList[j].Contains(suffix))
                        {
                            files.Add(separatorList[j]);
                        }
                    }
                }
            }
            //写入Bat文件
            int count = ;
            for (int i = ; i < files.Count; i++)
            {
                string filePath = FindFile(I386PackSourcePath, files[i]);
                StringBuilder batStr = new StringBuilder();
                if (!string.IsNullOrEmpty(filePath))
                {
                    //File.Copy(filePath, targetPath);
                    batStr.AppendLine(string.Format("copy %1\\{0} %2\\{1} /y", filePath.Substring(filePath.IndexOf(I386PackSourcePath)), files[i]));
                    count++;
                }
                File.WriteAllText(I386BatPath, batStr.ToString());
            }
            return count + "/" + files.Count;
        }
        #endregion
    }

PS:以前我是用的File.Copy来拷贝文件,后来泉哥说这样不好,该为只是生成一个bat文件,里面存放了拷贝文件的命令,手动运行来拷贝文
件,这样的好处是一旦需要手动修改某个单独的文件拷贝,可以直接编辑bat文件来实现,而不用改动程序。于是程序就变成这样了。这里的"%1、%2"是到
时候接受命令行的参数。

这里代码中的后缀名都是经过反复检验得知的,Windows Server 2003和Windows Server 2003 R2一样,但是和Windows XP的后缀名要求不一样。

Program程序代码如下:


 class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(@"请输入以下参数:");
            Console.WriteLine(@"1.操作系统名称:");
            string operatingSystemName = Console.ReadLine();
            Console.WriteLine(@"2.Inf文件路径:");
            string infPath = Console.ReadLine();
            Console.WriteLine(@"3.I386源文件路径(路径需包含\i386):");
            string sourcePath = Console.ReadLine();
            Console.WriteLine(@"4.要生成的Bat文件路径:");
            string batPath = Console.ReadLine();             Console.WriteLine("{0}:开始查找文件,请稍后...",DateTime.Now);
            IISManager iisManager = new IISManager(operatingSystemName, infPath, sourcePath, batPath);
            Console.WriteLine("{0}:成功发现{1}个文件!",DateTime.Now, iisManager.GetRequiredFiles());
            Console.WriteLine("{0}:程序结束!", DateTime.Now);
        }
    }

执行了生成的bat文件后,我们便获得了IIS安装需要的所有安装文件了,不再需要光盘了。

另外这里要注意:在64位操作系统的光盘中,IIS安装文件不只是在i386文件夹中,还有大
部分在AMD64文件夹中。因此我们需要把光盘中的i386文件夹中的文件和AMD64文件夹中的文件都搞出来,不然以后安装IIS的时候会提示找不到在
AMD64文件夹下的文件。

问题3:如何静默安装IIS?

回答:这个问题最初我也不知道,于是在网上找了找,找到一篇:http://hi.baidu.com/2fred/blog/item/824cd9b48dfeb57b8bd4b237.html 文章。

这篇文章的Windows 7的IIS安装很有用,我们后面的Windows 7 IIS安装就用的他的方法,但是XP的脚本不是很理解,2003的IIS也可没有提供,因此又找到了几篇微软的文章:

http://support.microsoft.com/kb/222444http://support.microsoft.com/kb/309506

这两篇文章都是泉哥找到的,这也让我更深刻的觉得,好的程序员往往都有能快速搜索到有效资源的能力,这方面我真还得多多锻炼和学习。^_^

这两篇文章里清晰地说明了IIS的安装命令,即用到系统自带的sysocmgr.exe程序:

sysocmgr /q /i:%windir%\inf\sysoc.inf /u:c:\ocm.txt

此处要注意的是/u:后面的路径c:\ocm.txt,这个文件是安装IIS时的配置,也就是哪些要安装,哪些不需要安装,这个txt文件的内容别人网站也给出来了:

[Components]
iis_common = ON
iis_www = ON
iis_www_vdir_scripts = ON
iis_inetmgr = ON
fp_extensions = OFF

iis_ftp = OFF

这里最后两个设置为OFF与原文不一样,不过这样不影响,因为我们只需要安装最基本的组件。

因此我们的思路就是把上面的Components文本放在一个txt文件中,然后让程序执行绿色那行的命令,IIS即安装成功。

此处我试探性的把所有的选项都设置为OFF,运行之后发现IIS被卸载,于是卸载IIS也如此简单!

这里让.Net执行命令行也在网上查了查方法,代码如下:


        /// <summary>
        /// 执行命令行
        /// </summary>
        /// <param name="optionalFilePaths">命令</param>
        /// <returns>返回结果</returns>
        protected virtual string ExecuteCmd(string[] optionalFilePaths)
        {
            //运行命令行
            Process p = new Process();
            // 设定程序名
            p.StartInfo.FileName = "cmd.exe";
            // 关闭Shell的使用
            p.StartInfo.UseShellExecute = false;
            // 重定向标准输入
            p.StartInfo.RedirectStandardInput = true;
            // 重定向标准输出
            p.StartInfo.RedirectStandardOutput = true;
            //重定向错误输出
            p.StartInfo.RedirectStandardError = true;
            // 设置不显示窗口
            p.StartInfo.CreateNoWindow = true;
            // 启动进程
            p.Start();
            for (int i = ; i < optionalFilePaths.Length; i++)
            {
                p.StandardInput.WriteLine(optionalFilePaths[i]);
            }
            p.StandardInput.WriteLine("exit");
            // 从输出流获取命令执行结果
            string strRst = p.StandardOutput.ReadToEnd();
            p.WaitForExit();
            p.Close();
            return strRst;
        }

方法的返回值是输出结果,传入值是需要执行的命令数组,这里我们只需要将绿色那行命令传入此方法即可,但记得修改最后的文本文件路径噢!

在我的程序中我写了两个文本文件,一个是安装IIS的,一个是卸载IIS的,只需要在方法中变更对应传入的文本文件路径即可。

XP测试是通过了,下面还需要测试XP的SP1、2、3版本。我只举例说明SP1版本,后面的版本方法类似。

我们知道SP1版本中IIS肯定是有所更新,那么我们如何正确的更新以前我们拷贝出来的原版的i386文件呢?这时就要用到文件的集成。

问题4:如何集成Windows ServicePack中的文件?

回答:这个我也在网上找到了方法:http://masida.blog.51cto.com/719236/168928

执行SP光盘i386中update文件夹中的update方法:

integrate表示集成,后面的路径就填写之前我们拷贝出来的原版i386文件。执行后SP1中更新的的i386文件就替换了原版的i386文件,而没有更新的则不会改变。

i386文件更新后,我们则需要重新再重复以前的步骤,解压缩出iis.inf文件-->拷贝出对应后缀名的文件-->安装IIS。

SP2、SP3同理。

最后我们得到的i386文件就是最新的版本,这个时候我们将这个最新版本的IIS安装文件放在原版XP、XP SP1、XP SP2、XP
SP3中测试,发现IIS安装能够成功,于是最后我们的程序只需要一个最新版本的i386文件夹(此文件夹里放置的是拷贝出来的IIS安装必需的文件,大
概16.3M);两个文本文件:一个是安装IIS的配置、一个是卸载IIS的配置;然后一个exe控制台程序。控制台程序代码将在后面一起发放。

另外,安装好IIS之后,还需要在IIS中注册ASP.NET。

问题5:如何注册Asp.Net?

回答:有一个aspnet_regiis工具,专门就是做这件事的。参考http://zhengmeishuang.javaeye.com/blog/599036,具体方法是:在命令行中输入:

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis -i

此处还需注意一点:如果是64位的操作系统,则命令有点不一样,http://www.wormsky.com/read.php/284.htm

C:\WINDOWS\Microsoft.NET\Framework64\v2.0.50727\aspnet_regiis -i

即可注册成功,此操作需在安装好IIS之后执行。这里我简单解释一下,该命令前面的路径是系统盘所在的路径,因为客户的系统不一定都是安装在C盘,
所以编程时需要利用环境变量查看操作系统所在盘符。中间的v2.0.50727是要注册的Asp.Net的版本号,可以根据需要改变,所以在程序中,我们
的代码如下:


        /// <summary>
        /// 在ASP.NET中注册IIS
        /// </summary>
        protected void RegIISForAspnet()
        {
            if (CheckOSBitness.Is64BitOperatingSystem())
                ExecuteCmd(Path.Combine(System.Environment.GetEnvironmentVariable("windir"), @"Microsoft.Net\Framework64\v2.0.50727\aspnet_regiis -i"));
            else
                ExecuteCmd(Path.Combine(System.Environment.GetEnvironmentVariable("windir"), @"Microsoft.Net\Framework\v2.0.50727\aspnet_regiis -i"));
        }

windir的变量就是用来替代"C:\Windows",把这个方法放在装好IIS之后执行即可!

如果以我们目前的程序运行,你会发现在安装IIS时,系统会弹出对话框让你选择i386文件夹的路径,这也就是说系统在默认的文件夹里没有找到我们
的i386安装文件夹。因此我们还需要做一个工作,就是在安装之前把默认查找安装文件的路径该为我们程序的i386文件夹路径,然后在安装完成之后再把路
径改回来。

问题6:如何更改默认查找i386文件夹的路径?

回答:用程序修改在注册表中默认路径的值。参考http://forum.soft32.com/windows/ServicePackCachePath-ServicePackSourcepath-Source-Path-ftopict278557.html

在注册表中找到HKLM\SOFTWARE\Microsoft\Windows\Setup。我们只需要修改其中两个关键的
值:ServicePackSourcePath和SourcePath。在修改时要注意,此路径不应包含i386的名字,因该是我们的i386文件夹的
父目录的路径,即如果我们的i386文件夹路径为D:\OnClickIIS\I386,那么我们应把注册表中的路径该为:D:\OnClickIIS即
可:


 /// <summary>
        /// 修改安装查找路径
        /// </summary>
        protected void AmendRegeditPath()
        {
            RegistryKey pRegKey = Registry.LocalMachine;
            pRegKey = pRegKey.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Setup", true);
            regServicePackSourcePath = pRegKey.GetValue("ServicePackSourcePath").ToString();
            regSourcePath = pRegKey.GetValue("SourcePath").ToString();
            pRegKey.SetValue("ServicePackSourcePath", I386PackPath.Substring(, I386PackPath));
            pRegKey.SetValue("SourcePath", I386PackPath.Substring(, I386PackPath));
        }
        /// <summary>
        /// 恢复安装查找路径
        /// </summary>
        protected void ReStoreRegeditPath()
        {
            RegistryKey pRegKey = Registry.LocalMachine;
            pRegKey = pRegKey.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Setup", true);
            pRegKey.SetValue("ServicePackSourcePath", regServicePackSourcePath);
            pRegKey.SetValue("SourcePath", regSourcePath);
        }

这里OpenSubKey里的true参数表示要让注册表可写,如果是该为false,则我们执行后面的SetValue操作时会抛异常。这里我用
了两个变量存储原来注册表中的路径值,在结束时再把值还原回去,为了保证每次程序都能够还原注册表,我选择把ReStoreRegeditPath方法放
在了Finally中:


        /// <summary>
        /// 开始安装IIS
        /// </summary>
        internal override void InstallIIS()
        {
            try
            {
                AmendRegeditPath();                 ExecuteCmd(SysocmgrCmd + "\"" + InOptionalFilePath + "\"");                 RegIISForAspnet();
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                ReStoreRegeditPath();
            }
        }
        /// <summary>
        /// 开始卸载IIS
        /// </summary>
        internal override void UnInstallIIS()
        {
            ExecuteCmd(SysocmgrCmd + "\"" + UnOptionalFilePath + "\"");
        }

在卸载IIS时则不用修改路径,因为卸载时用不到i386文件夹。

此时,XP各个版本的IIS安装都可以通过这个程序来完成了!

再继续测试Windows
Server 2003,我发现原来2003的安装IIS方法和XP基本一样,所以我们的程序不需要做任何改动就可以在2003上面运行,只是2003的
i386文件需要我们用和XP一样的方法搞出来,还有就是2003的安装配置文件也有一点点不同:

[Components]
iis_common = ON
iis_www = ON
iis_asp = ON
iis_inetmgr = ON
aspnet= ON

之后在Windows Server 2003 R2 SP2、Windows Server 2003 R2 x64 SP2的版本测试也是顺利通过,此处要注意:2003和2003 R2和2003 R2 x64的版本的i386文件都不一样,不能偷懒,必须都用上面的方法从光盘的到,另外2003 R2 x64版本除了有i386文件,还需要有AMD64文件。

因此现在我们的程序已经能够顺利在XP(原版、SP1、SP2、SP3)和2003(原版、SP1、SP2)以及2003 R2(32位和64位的SP2)中测试通过了^_^

因为程序是用Visual Studio 2008做的,所以要成功运行程序需要系统先装上.NetFramwork3.5,而安装.NetFramwork3.5对于系统的要求是:

Windows XP:SP2及以上

Windows Server 2003(R2或非R2):SP1及以上

这一篇篇幅太长了,因此我分为2篇来完成。在下一篇中我将主要阐述Windows 7的IIS安装以及如何自动识别用户操作系统来调用正确的安装方法!

一键安装IIS的点点滴滴——For所有Microsoft的操作系统(上)的更多相关文章

  1. 一键安装IIS的点点滴滴——For所有Microsoft的操作系统(下)

    原文 http://www.cnblogs.com/cdts_change/archive/2010/03/09/1681392.html 接着上一篇的讲,下面我们将讨论Windows7.Window ...

  2. CentOS7 一键安装KMS服务【整理】

    KMS,是 Key Management System 的缩写,也就是密钥管理系统.这里所说的 KMS,毋庸置疑就是用来激活 VOL 版本的 Windows 和 Office 的 KMS 啦.经常能在 ...

  3. Win7如何安装IIS来浏览ASP网站

    1 进入控制面板-->程序与功能-->点击左侧的"打开或关闭Windows功能"-->把"Internet信息服务"给勾上,点击"确 ...

  4. IIS 一键安装及卸载

    IIS6:适用于win server 2003:: ******************* :: * 安装 :: ******************* :Install Cls @echo. &am ...

  5. XP安装IIS来加载aspx页面(Web调用SAP数据)

    1,安装IIS 在XP中安装IIS方法很简单,安装时需要提供安装光盘来加载I386文件,可以使用虚拟光驱或光盘.在此做个简单说明(控制面板-添加/删除 Windows组件-勾选Internet信息服务 ...

  6. ghost xp 安装IIS,并配置WCF

    因要一台电脑做WCF服务的测试服务器,但只有一个台式机可能,配置就不用说了,2G内存.之前装的是win7,卡得要死.于是就想把它装回XP系统.但在网上找来找去,都是ghost xp,之前还很怕ghos ...

  7. win7安装IIS及将网站发布到IIS上

    1. WIN7安装IIS:  控制面板----程序和功能-----打开或关闭windows功能,如图 展开Internet信息服务,按照下图方式进行选择,然后单击"确定",等待几分 ...

  8. windows下使用xampp一键安装apache+php运行环境

    感谢浏览,欢迎交流=.= 想为我老爸开发一套库存管理系统,借此机会打算使用下ext+php+apache+linux环境尝尝鲜. 为了在windows搭建本地开发测试环境,官网下载xampp,一键安装 ...

  9. Win7安装IIS

    非常明显的,我们做系统是用来给人用的,所以这就涉及到对系统的公布问题.仅仅有公布之后.别人才干通过訪问你的IP和port号来訪问你的程序. 而系统公布一般都是在IIS上面进行系统公布,所以我们就必需要 ...

随机推荐

  1. Android Animations简介

    一 .Animations简介 Animations提供了一系列的动画效果,这些效果可以应用于绝大多数的控件: 二.Animations的分类 第一类:TweenedAnimations,该类Anim ...

  2. Linux调试工具strace和gdb常用命令小结

    strace和gdb是Linux环境下的两个常用调试工具,这里是个人在使用过程中对这两个工具常用参数的总结,留作日后查看使用. strace调试工具 strace工具用于跟踪进程执行时的系统调用和所接 ...

  3. 【剑指offer】面试题41:和为 s 的两个数字 VS 和为 s 的连续正数序列

    题目: 输出所有和为S的连续正数序列.序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序 思路: small代表序列最小数字,large代表序列最大数字.初始化small为1,large为2. ...

  4. [置顶] android之存储篇_SQLite数据库_让你彻底学会SQLite的使用

    SQLite最大的特点是你可以把各种类型的数据保存到任何字段中,而不用关心字段声明的数据类型是什么. 例如:可以在Integer类型的字段中存放字符串,或者在布尔型字段中存放浮点数,或者在字符型字段中 ...

  5. xm学习笔记

    1关于静态网页的制作 html主要负责页面的结构+css页面的美观+js与用户的交互. 2html 有标签体的标签: <p></p>  <span></spa ...

  6. eclipse 添加resources 目录

    java项目需要一些配置,配置放置目录如:/src/main/resources; 如果没有这个文件夹,需要右键项目>new>source folder > Folder name ...

  7. JavaScript 数组中查找符合条件的值

    数组实例的find方法,用于找出第一个符合条件的数组成员.它的参数是一个回调函数,所有数组成员依次执行该回调函数,直到找出第一个返回值为true的成员,然后返回该成员.如果没有符合条件的成员,则返回u ...

  8. Ubuntu 14.04根据系统,休眠后不能启动要解决的问题

    简介: 提升Ubuntu制度14.04之后,当系统进入休眠,我们不能再次启动,直接崩溃,凡出了问题? 1.   问题纳入 Ubuntu升级系统14.04之后.通过系统的Power设置休眠时间,在系统进 ...

  9. HDU 多校联合练习赛2 Warm up 2 二分图匹配

    Warm up 2 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total ...

  10. kvm 启动libvirtd市出现错误

    kvm 启动libvirtd市出现错误: /etc/init.d/libvirtd start启动 libvirtd 守护进程:libvirtd: relocation error: libvirtd ...