( Sun, 13 Feb 2011 22:52:48 +0800 )
Description:
//附I taller类
using System;
name ace MyI taller
/// < ummary
/// MyI taller 的摘要说明。
/// /summary
public cla MyI taller:System.Configuration.I tall.I taller {
public MyI taller():base()
// TODO: 在此处添加构造函数逻辑
this.BeforeI tall+=new System.Configuration.I tall.I tallEventHandler(MyI taller_BeforeI tall);
this.AfterI tall+=new System.Configuration.I tall.I tallEventHandler(MyI taller_AfterI tall);
this.Committed+=new System.Configuration.I tall.I tallEventHandler(MyI taller_Committed);
this.Committing+=new System.Configuration.I tall.I tallEventHandler(MyI taller_Committing);
private void MyI taller_BeforeI tall(object sender, System.Configuration.I tall.I tallEventArgs e)
System.Windows.Forms.Me ageBox.Show( "before i tall ");
private void MyI taller_AfterI tall(object sender, System.Configuration.I tall.I tallEventArgs e)
System.Windows.Forms.Me ageBox.Show( "after i tall ");
} private void MyI taller_Committed(object sender, System.Configuration.I tall.I tallEventArgs e)
System.Windows.Forms.Me ageBox.Show( "MyI taller_Committed ");
private void MyI taller_Committing(object sender, System.Configuration.I tall.I tallEventArgs e)
System.Windows.Forms.Me ageBox.Show( "MyI taller_Committing ");
protected override void OnBeforeI tall(System.Collectio .IDictionary savedState)
base.OnBeforeI tall (savedState);
System.Windows.Forms.Me ageBox.Show( "before i tall ");
new I tallDir().Show();
// Override the 'I tall ' method.
public override void Uni tall(System.Collectio .IDictionary savedState)
base.Uni tall (savedState);
public override void Commit(System.Collectio .IDictionary savedState)
base.Commit (savedState);
public override void I tall(System.Collectio .IDictionary stateSaver)
base.I tall (stateSaver);
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号世纪乐知(北京)网络技术有限公司 提供技术支持江苏乐知网络技术有限公司 提供商务支持Copyright 1999-2010, CSDN.NET, All Rights Reserved
引文来源 ( Sun, 13 Feb 2011 22:52:36 +0800 )
Description:
用户操作 [留言] [发消息] [加为好友] cxyyxc的文章原创 13 篇翻译 0 篇转载 17 篇评论 2 篇订阅我的博客 存档
2007年08月(30) 如何用VS2005制作Web***程序
网站完成后,需要部署到目标机器上,方法有很多,直接把文件Copy到目标机器上,执行SQL脚本,配置IIS,这样可以做到;也可以使用I tallShield这样到专业制作软件来打包。本篇文章是使用VS2005自带到***部署工具来制作exe***文件。
涉及到到内容包括:使用***部署工具,建立数据库,配置IIS,文件操作,注册表等。参考了网上关于使用VS制作***程序的文章。环境:Windows2003 + VS2005 + SQL2005。
注:本文只是为了实现,没有强调方法,变量等的写法标准。
我想一般常用的可能就最上面的两种。当使用Web***项目时,执行制作好的msi***文件时,会发现实际上是添加虚拟目录而不是添加网站,而且无法选择***目录,当然,可以自己写脚本来对IIS进行修改。不过在这篇文章里,将不采用此模式。本篇文章用的是使用“***项目”,就和打包WinForm程序一样,把Web文件部署到目标机器上,然后重写i tall方法,配置IIS,执行SQL脚本,修改web.config文件等。
在开始整个过程之前,需要先了解一下“预编译”的概念,MSDN上的说明是:默认情况下,在用户首次请求资源(如网站的一个页)时,将动态编译 ASP.NET 网页和代码文件。第一次编译页和代码文件之后,会缓存编译后的资源,这样将大大提高随后对同一页提出的请求的效率。请查阅MSDN“预编译”相关文档。
准备一个文件DBSQL.txt,在里面包含连接数据库后需要执行的SQL脚本,在本例中使用了简单的一个Create Tabel的SQL。
打开VS2005,打开一个网站项目,这里是打开的本地localhost,如图:
新加一个页面,随便取个名字(本文中为ClientCallback.a x),然后写一个简单的按钮事件即可,这不是本文的重点,由你随意处理^_^ 再添加web配置文件即web.config,在下添加
此文件到时候是需要发布到目标机器上的。(关于连接数据库字符串,VS2005里面有专门的co ectionStrings,本文未使用,可查阅帮助)
选择菜单生成=》发布网站:
点击确定后,网站已经生成,这些就是需要部署到目标机器上的所有文件。
点击菜单文件=》添加=》新建项目,添加***部署项目,如图:
添加***项目类库:
删除默认的Cla 1.cs,新加一个***程序类文件,名为MyI taller.cs:
在此项目中,添加对System.EnterpriseServices和System.DirectoryServices的引用,在操作IIS的时候,需要用到。在文件中添加:
using System;
using System.IO;
using System.DirectoryService using System.Reflectio using System.Data;
using System.Data.SqlClient;
using System.Configuration.I tall;
using System.Management;
using System.Collectio using Microsoft.Win32;
using System.Collectio .Specialized;如果编译的时候出错,请添加相关引用。
修改文件如下图:
回到MyWebSetup项目,点击查看属性,可以设置***文件到显示相关信息,如图
然后:
(在文件系统中,在属性里面可以设置***程序默认到***路径)
添加一个叫bin文件夹并添加在生成网站时bin目录下的dll文件,如图:
在应用程序文件夹下在生成网站时目录下的文件,添加后如图:
选择“用户界面编辑器”,添加两个文本框A和B,A将作为***新站点后的IIS设置,B将作为数据库操作时的参数设置,调整位置后如下:
调整A的属性,这里只选择了显示两个输入框,属性分别为IISSERVER和PORT,值为localhost和9998,其他的你可以自己调整。如图:
OK,文本框设置完毕。当然,你还可以选择其他的多种文本框,如协议什么的。
打开自定义操作面板:
然后:
/d ame=[DBNAME] /server=[DBSERVERNAME] /user=[USERNAME] /pwd=[PASSWORD] /iis=[IISSERVER] /port=[PORT] /targetdir="[TARGETDIR]\"
这些参数就是文本框A和B上的输入框的值,在***过程中可以获得,然后进行处理。
至此,基本的***文件已经制作完毕。进行生成,然后点击***,可以看到文件已经复制到了相应到目录。接下来就要接收参数对IIS和数据库进行处理。
打开SetupCla Library项目下的MyI taller.Designer.cs,修改此文件。
申明几个变量: private System.Data.SqlClient.SqlCo ection sqlCo private System.Data.SqlClient.SqlCommand Command; private string AdminPwd; private string ii public static string VirDirSchemaName = "IIsWebVirtualDir"; private DirectoryEntry _iisServer; private Co ectionOptio _co ectio 连接数据库服务器到方法: if (Command.Co ection.State != Co ectionState.Open) Command.Co ection.Open(); return false;
如果不能正确连接数据库服务器,请检查你的连接字符串,或者将连接字符串写入文件查看。不好意思,我不知道如何对这种***部署程序进行debug,sorry咯!
#region GetSql 从文件中读取SQL,在读取包含SQL脚本的文件时需要用到,参考自MSDN private string GetSql(string Name) A embly Asm = A embly.GetExecutingA embly(); Stream strm = Asm.GetManifestResourceStream(Asm.GetName().Name + "." + Name); StreamReader reader = new StreamReader(strm); return reader.ReadToEnd(); catch (Exception getException) throw new A licationException(getException.Me age); private void ExecuteSql(string DataBaseName, string sqlstring) Command = new System.Data.SqlClient.SqlCommand(sqlstring, sqlCo ); Command.Co ection.ChangeDatabase(DataBaseName); Command.ExecuteNonQuery(); Command.Co ection.Close();
创建数据库及数据库表:
#region CreateDBAndTable 创建数据库及数据库表,参考自MSDN protected bool CreateDBAndTable(string DBName) ExecuteSql("master", "USE MASTER IF EXISTS (SELECT NAME FROM SYSDATABASES WHERE + DBName + "') DROP DATABASE " + DBName); ExecuteSql("master", "CREATE DATABASE " + DBName); ExecuteSql(DBName, GetSql("DBSQL.txt")); {
从备份文件恢复数据库及数据库表
#region RestoreDB 从备份文件恢复数据库及数据库表 protected bool RestoreDB(string DBName) dir = this.Context.Parameters["targetdir"]; bool Restult = false; string MSQL = "RESTORE DATABASE " + DBName + " FROM DISK = '" + dir + @"data.bak' " + " WITH MOVE 'Test' TO '" + @"c:\" + DBName + ".mdf', " + " MOVE 'Test_log' TO '" + @"c:\" + DBName + ".ldf' "; ExecuteSql("master", "USE MASTER IF EXISTS (SELECT NAME FROM SYSDATABASES WHERE + DBName + "') DROP DATABASE " + DBName); ExecuteSql("master", MSQL); Restult = true; File.Delete(dir + @"data.bak");
这里可以到注册表读取SQL Server的***路径,把恢复后的数据库文件放到data目录地下。在本例中,只是实现了恢复,并未进行标准的操作。其中Test和Test_log时备份时数据库的文件信息。如果想要从备份文件中恢复,请把文件包含到项目里并且设置和DBSQL.txt一样,嵌入到程序里。最后执行删除。不过我想应该有办法不把文件先***到目标机器上,而是有方法想读取DBSQL.txt文件一样,直接恢复数据库,不过确实没想到办法,失败!
网站***好后,需要设置web.config文件,这里只涉及到连接字符串到设置,其他的可以同理修改。 #region WriteWebConfig 修改web.config的连接数据库的字符串 private bool WriteWebConfig() System.IO.FileInfo FileInfo = new System.IO.FileInfo(this.Context.Parameters["targetdir"] + "/web.config"); if (!FileInfo.Exists) throw new I tallException("Mi ing config file :" + this.Context.Parameters["targetdir"] + "/web.config"); System.Xml.XmlDocument xmlDocument = new System.Xml.XmlDocument(); xmlDocument.Load(FileInfo.FullName); foreach (System.Xml.XmlNode Node in xmlDocument["configuration"]["a Settings"]) if (Node.Name == "add") if (Node.Attributes.GetNamedItem("key").Value == "Co ectionString") Node.Attributes.GetNamedItem("value").Value = String.Format("Persist Security Info=False;Data Source={0};database={1};User Size=4096;Pooling=true;Max Pool Size=100;Min Pool Size=1", ServerName, DBName, AdminName, AdminPwd); FoundIt = true; throw new I tallException("Error when writing the config file: web.config"); xmlDocument.Save(FileInfo.FullName);
#region WriteRegistryKey 写注册表。***部署中,直接有一个注册表编辑器,可以在那里面设置。 private void WriteRegistryKey() RegistryKey hklm = Registry.LocalMachine; RegistryKey cqfeng = hklm.OpenSubKey("SOFTWARE", true); RegistryKey F = cqfeng.CreateSubKey("cqfeng"); F.SetValue("FilePath", "kkkk"); public bool Co ect() if (iis == null) _iisServer = new DirectoryEntry("IIS://" + iis + "/W3SVC/1"); _target = ii _co ection = new Co ectionOptio (); _scope = new ManagementScope(@"\\" + iis + @"\root\MicrosoftIISV2", _co ection); _scope.Co ect(); return false; return IsCo ected(); public bool IsCo ected() if (_target == null || _co ection == null || _scope == null) return false; return _scope.IsCo ected;
#region IsWebSiteExists 判断网站是否已经存在 public bool IsWebSiteExists(string serverID) string siteName = "W3SVC/" + serverID; ManagementObjectSearcher searcher = new ManagementObjectSearcher(_scope, new ObjectQuery("SELECT * FROM IIsWebServer"), null); ManagementObjectCollection webSites = searcher.Get(); foreach (ManagementObject webSite in webSites) if ((string)webSite.Properties["Name"].Value == siteName) return true; return false; return false; #region GetNextOpenID 获得一个新的ServerID private int GetNextOpenID() DirectoryEntry iisComputer = new DirectoryEntry("IIS://localhost/w3svc"); foreach (DirectoryEntry iisWebServer in iisComputer.Children) string ame = iisWebServer.Name; int if (name nextID) nextID = name; return ++nextID; public string CreateWebSite(string serverID, string serverComment, string defaultVrootPath, string HostName, string IP, string Port) ManagementObject oW3SVC = new ManagementObject(_scope, new ManagementPath(@"IIsWebService='W3SVC'"), null); if (IsWebSiteExists(serverID)) return "Site Already Exists..."; ManagementBaseObject i utParameters = oW3SVC.GetMethodParameters("CreateNewSite"); ManagementBaseObject[] serverBinding = new ManagementBaseObject[1]; serverBinding[0] = CreateServerBinding(HostName, IP, Port); i utParameters["ServerComment"] = serverComment; i utParameters["ServerBindings"] = serverBinding; i utParameters["PathOfRootVirtualDir"] = defaultVrootPath; i utParameters["ServerId"] = serverID; ManagementBaseObject outParameter = null; outParameter = oW3SVC.InvokeMethod("CreateNewSite", i utParameters, null); string serverName = "W3SVC/" + serverID; ManagementObject webSite = new ManagementObject(_scope, new ManagementPath(@"IIsWebServer='" + serverName + "'"), null); webSite.InvokeMethod("Start", null); return (string)outParameter.Properties["ReturnValue"].Value; catch (Exception ex) return ex.Me age; public ManagementObject CreateServerBinding(string HostName, string IP, string Port) ManagementCla cla Binding = new ManagementCla (_scope, new ManagementPath("ServerBinding"), null); ManagementObject serverBinding = cla Binding.CreateI tance(); serverBinding.Properties["Hostname"].Value = HostName; serverBinding.Properties["IP"].Value = IP; serverBinding.Properties["Port"].Value = Port; serverBinding.Put(); return serverBinding; return null;
好了,准备工作已经做完,现在开始写最重要的I tall方法了
整个方法写完后如下: public override void I tall(IDictionary stateSaver) base.I tall(stateSaver); dir = this.Context.Parameters["dir"]; DBName = this.Context.Parameters["DBNAME"].ToString(); ServerName = this.Context.Parameters["server"].ToString(); AdminName = this.Context.Parameters["user"].ToString(); AdminPwd = this.Context.Parameters["pwd"].ToString(); iis = this.Context.Parameters["iis"].ToString(); ; port = this.Context.Parameters["port"].ToString(); 写入获取的***程序中的变量,此段代码为调试用可以不添加 this.sqlCo .Co ectionString = "Packet size=4096;User + AdminName + ";Data Source=" + ServerName + ";Pa word=" + AdminPwd + ";Persist Security Info=False;Integrated Security=false";
执行SQL ***数据库 可选择时恢复或者时直接创建 if(!CreateDBAndTable(DBName)) throw new A licationException("创建数据库时出现严重错误!"); if (!RestoreDB(DBName)) throw new A licationException("恢复数据库时出现严重错误!"); //string serverID = GetNextOpenID().ToString(); //string serverComment = we itenName;
下面的信息为测试,可以自己编写文本框来接收用户输入信息 string serverID = "5555"; string serverComment = "cqfeng"; string defaultVrootPath = this.Context.Parameters["targetdir"]; if (defaultVrootPath.EndsWith(@"\")) defaultVrootPath = defaultVrootPath.Su tring(0, defaultVrootPath.Length-1); string Port = port; string sReturn = CreateWebSite(serverID, serverComment, defaultVrootPath, HostName, IP, Port); if (!WriteWebConfig()) throw new A licationException("设置数据库连接字符串时出现错误"); WriteRegistryKey();
删除时的方法。在本文中未详细操作,比如删除站点,删除数据库等。如果需要,请你自己补足 public override void Uni tall(IDictionary savedState) if (savedState == null) throw new A licationException("未能卸载!"); base.Uni tall(savedState);
编译,然后选择***,如图:
第一图:
第二图:
第三图:
第四图:
第五图:
***:
***完成:
***目录:
***后的数据库:
至此,一个简单的部署web程序的exe文件已经完成,当然,省略了很多东西,比如,对***机器的判断(IIS版本,Framework版本,SQL Server版本等),IIS站点属性等设置(默认页面,访问权限,执行权限等),卸载程序时应该删除的东西等等。这些东西,在MSDN里面可以查找到相关说明,如果你需要,只有辛苦一下了,嘿嘿。
问题:***的时候输入密码时无法显示为*号;***文件夹中出现编译后的***类编译后的dll文件。哪位大哥对这些比较熟悉的,指点指点……………..
写得不是很仔细,如果有问题或者错误,请你自己多调试一下! 发表于 @ 2007年08月04日 09:43:00 | | 举报|
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号世纪乐知(北京)网络技术有限公司 提供技术支持江苏乐知网络技术有限公司 提供商务支持Copyright 1999-2010, CSDN.NET, All Rights Reserved
引文来源 ( Sun, 13 Feb 2011 22:31:02 +0800 )
Description:
using System;
using System.Collectio .Generic;
using System.Text;
using System.ServiceProce name ace MyWindowsService
{ /// < ummary /// 本对象用于配合.NET框架的I tallUtil.exe的工作,用于向Windows系统***和卸载服务 /// /summary [System.ComponentModel.RunI taller(true)] public cla MyServiceI taller : System.Configuration.I tall.I taller { /// < ummary /// 初始化对象 /// /summary public MyServiceI taller() { System.ServiceProce .ServiceI taller i taller = new ServiceI taller(); i taller.Description = "这是杜哥学习Windows服务的第一个示例程序。"; i taller.Di layName = "杜哥文件系统监视服务"; i taller.ServiceName = "MyFileSystemWatcher"; //i taller.StartType = ServiceStartMode.Manual; i taller.StartType = ServiceStartMode.Automatic; System.ServiceProce .ServiceProce I taller proi taller = new System.ServiceProce .ServiceProce I taller(); // 采用本地系统帐户运行服务 // 若采用其他帐户则可能没有权限访问数据库 proi taller.Account = System.ServiceProce .ServiceAccount.LocalSystem; this.I tallers.Add(i taller); this.I tallers.Add(proi taller); // AfterI tall 启动服务 this.AfterI tall += delegate(object sender, System.Configuration.I tall.I tallEventArgs e) { System.ServiceProce .ServiceController sc = new System.ServiceProce .ServiceController(); sc.ServiceName = "MyFileSystemWatcher"; sc.Start(); }; } }
网易公司版权所有 copy;1997-2011
引文来源 ( Sun, 13 Feb 2011 21:32:36 +0800 )
Description: 1. MC3000的机型应用程序的***需要以下几个CAB文件:
a) 应用程序打包成CAB文件(也可以不做***包,具体见后面详解);
b) NETCFv2.wce5.armv4i.cab,这是.NET Compact Framework v2.0的一个***包;或者NETCFv35.wce.armv4.cab ,这是.NET Compact Framework v3.5 的一个***包;
一般而言,上述***包会存放在如下目录:C:\Program Files\Microsoft.NET\SDK\CompactFramework\v3.5\WindowsCE。
c) symbol.all.arm.cab,这是SYMBOL的一个***包,在Symbol提供的软件开发包中;
d) sqlce30.dev.CHS.wce5.armv4i.CAB,sqlce30.repl.wce5.armv4i.CAB,sqlce30.wce5.armv4i.CAB,这三个CAB***包是SQL CE数据库必须的。如果不是有SQL CE 数据库,则这些文件不需要***。
System_SR_CHS.CAB,这是调试用到的一个***包,不是必须的。
用.NET制作的应用程序部署到PDA上之前,必须***.NET Compact Framework v2.0 或者.NET Compact Framework v3.5。由实际设备项目程序开发的版本来定,也就是上面的***包,此外还要装SYMBOL的一个***包(symbol.all.arm.cab),这些都是运行应用程序必须的环境。如果没有用到SQL CE,则其他几个***包不是必须的。
2. 防止CAB文件自动重置的设置
(1)首先编写CPY文件。新建一个记事本,然后在上面写下遵循以下格式的语句。
这里以.Net Compact Framework v3.5 为例:
\a lication\NETCFv35.wce.armv4.cab \windows\ NETCFv35.wce.armv4.cab
\a lication\symbol.all.arm.ca \windows\symbol.all.arm.cab
保存为.cpy文件的格式。
(2)然后编写REG文件。
[HKEY_CURRENT_USER\Software\Symbol\Startup\Programs\Prog10]
"Name"="\windows\wceload.exe"
"Command"="\Windows\NETCFv35.wce.armv4.cab "
"Continue"=dword:0
"ColdBootOnly"=dword:1
[HKEY_CURRENT_USER\Software\Symbol\Startup\Programs\Prog11]
"Name"="\windows\wceload.exe"
"Command"="\Windows\symbol.all.arm.cab"
"Continue"=dword:0
"ColdBootOnly"=dword:1
将前面准备好的CAB文件同编写好的CPY / REG文件放到PDA的A lication目录下,就实现了在手持终端系统冷启动后将A lication路径下的CAB文件自动复制到\windows路径下,并且自动***。
应用程序可以不制作***包,直接把运行程序及快捷方式放在A lication目录下,并在CPY文件中建立快捷方式的自动复制语句将快捷方式复制到桌面上,这样PDA冷起后,直接点击桌面的快捷方式就可以运行应用程序了。
发评论
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。
新浪BLOG意见反馈留言板 不良信息反馈 ***:4006900000 提示音后按1键(按当地市话标准计费) 欢迎批评指正
新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑
Copyright 1996 - 2011 SINA Corporation, All Rights Reserved
引文来源 ( Sun, 13 Feb 2011 21:30:43 +0800 )
Description:
Windows CE编程初体验之自动***制作
最近正在研究Windows CE的编程,这几天刚写了两个小程序,都跟扫描有关,设备是Symbol的MC3000,系统是WinCE5.0,用.NET的C#写的代码。
虽然程序很简单,但确实也碰到了不少问题,上网搜索、发帖求教,终于也积累了不少经验,贴这里共享一下吧。
先写一下设备重启后自动***的问题吧,网上大部分说的好像都是在EVC下的方法,反正不适用。
这里说一下MC3000的自动***制作。
由于设备重启(冷启动)后,所有之前部署过的程序、文档都会丢失,只有A lication等几个目录(图标类似硬盘)中的文件不会变动。因此需要让设备在重启后自动***所需的***包。
1、将***包复制到A lication目录,并将***包设为只读,否则在***完后,系统会自动删除***包。如果有多个***包,可以直接放在A lication目录,也可以在其下新建一个文件夹,如MyI tall,并将相应的***包放入。
2、在PC上新建REG文件,比如要***.Net的SDK、Symbol的SDK、自己的程序,则可新建NETCF.REG、SYMBOL.REG、MYAPP.REG。
------REG文件内容如下-----------
; For Windows CE .NET devices
[HKEY_CURRENT_USER\Software\Symbol\Startup\Programs\Prog14]
"Name"="\windows\wceload.exe"
"Command"="/noaskdest \A lication\MyI tall\netcf.all.wce4.ARMV4I.cab"
"Continue"=dword:0
"ColdBootOnly"=dword:1
----------------------------------
其中,"Command"这一行最后面是***包的路径。如果有多个***包,其***的前后次序可能是跟Prog14有关,即第2个REG改成Prog15,第3个Prog16……这一点没有经过验证,反正我是这么做的。
然后将REG文件复制到设备的A lication目录。
如果需要在设备重启并***完所需的程序后,自动执行程序,则在PC上新建一个扩展名为RUN的文件,内容为该程序的路径,比如:
\Program Files\MyA \MyA .exe
然后将该文件复制到设备的\A lication\Startup\中。再检查一下A lication目录中是否有STARTUP.REG,其内容是否为:
[HKEY_CURRENT_USER\Software\Symbol\Startup]
"Path"=""
"NoSetup"=dword:1
如果没有则新建一个。
最后冷启动设备(1+9+开机键),设备进入系统后就会自动***并执行相应程序了。如果发现有不需要启动的程序,可在\A lication\Startup\下检查其余的RUN文件内容,不需要的就删除。
发评论
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。
新浪BLOG意见反馈留言板 不良信息反馈 ***:4006900000 提示音后按1键(按当地市话标准计费) 欢迎批评指正
新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑
Copyright 1996 - 2011 SINA Corporation, All Rights Reserved
引文来源 ( Sun, 13 Feb 2011 20:06:01 +0800 )
Description:
原作者:
Ralph Arvesen Vertigo Software, Inc.
翻译者:
应用:
Microsoft .NET Compact Framework 1.0
Microsoft Visual Studio .NET 2003
概要:
了解如何创建一个独立的.msi文件,通过运行台式机上该Msi文件在不同的Pocket Pc设备上***应用程序。
开发部署过程自动化,因此可以很容易的创建和打包所有必要的组件生成一个.msi文件。示例代码以C#和VB.Net语言提供。(共21印刷页)
这里下载范例代码
内容:
开发过程自动化
下面所列为开发和部署Pocket Pc应用程序的要点:
● Pocket Pc设备有不同的处理器类型(如ARM,SH3,MIPS等)。
● ***程序用.Cab格式部署。
● Cab向导(cabwiz.Exe)生成特定处理器的.cab文件。
● WinCE应用程序管理器部署和***桌面系统上的.cab文件到Pocket Pc设备上。
我们首先论述部署和卸载过程,然后是开发和开发过程的自动化。
用户可以拷贝和运行合适的.cab文件到他们的设备上,但是一个更好的解决方案是通过运行桌面上的一个.msi文件把应用程序装载到设备上。
.msi***文件检测设备的型号,拷贝正确的.cab文件到设备上,然后运行这个.cab文件***应用程序。所有的过程都对用户透明;
用户只要运行他们桌面系统上的一个.msi文件,应用程序就可以被自动的***到Pocket PC上。
下面是关于基于.msi文件部署的步骤:
● 用户在他们的桌面上运行.msi文件。
● msi文件解包成特定处理器的.cab文件,setup.ini和一个自定义***组件。
● 在***过程中被调用***组件,由***组件运行WinCE应用程序管理器(WinCE A lication Manager)部署和***正确的.cab文件到设备上。
● Setup.ini文件向WinCE应用程序管理器提供应用程序的描述信息。
下面的图说明与部署过程相关的各部分,接着是每个部分的描述信息。
图1.包含在部署过程中的各模块
.msi 文件
.msi文件是可以从桌面上***你的Pocket Pc应用程序的独立文件。用户运行.msi文件,它
解包成特定处理器的.cab文件,一个自定义***组件,和一个setup.ini文件。
.cab文件
通过运行.cab文件把Pocket PC应用程序***在设备上。这些文件是自解压文件,包含有***指令和应用程序所需的所有文件。这些文件是针对不同的处理器的,所以对于每一种应用程序支持的处理器需要单独的.cab文件。
***组件
这是一个在***过程中被调用的自定义组件。它运行WinCE应用程序管理器,通过它拷贝和***正确的.cab文件到设备上。
Setup.ini文件
向WinCE应用程序管理器描述应用程序信息的初始化文件,在WinCE应用程序管理器***应用程序的过程中是必不可少的。
WinCE应用程序管理器
WinCE应用程序管理器位于用户的桌面系统上,用于在Pocket PC设备上***和卸载应用程序。下图显示应用程序管理器提示用户将要***示例应用程序在Pocket Pc设备上。
图2.从桌面上***一个Pocket PC应用程序
卸载 .cab文件在Pocket PC上存储***信息,因此应用程序可以被卸载。用户可以在Pocket PC上直接卸载应用程序,或者从桌面上卸载。用Pocket PC卸载应用程序,用户可以选择应如下图所示的应用程序设置中的删除应用程序。
图3.使用Pocket PC卸载一个应用程序
就象***时一样,用户也可以从他们的桌面上卸载应用程序。从控制面板应用程序下的添加删除程序选择要卸载的程序,点击删除按钮。这个过程调用自定义***组件,由它使WinCE应用程序管理器运行在卸载模式(不需要指定一个Setup.Ini文件)。用户去掉应用程序上的对勾,点击OK去卸载Pocket PC上的应用程序。
图4.从桌面系统上卸载一个PocketPc程序
开发***程序
开发***程序的目标是用最小的工作量生成一个.msi文件(如果可能的话,点一下鼠标)。首先让我们看一下开发***程序过程所涉及的各部分:
● BuildCab.bat通过运行cab向导启动***过程。
● 信息文件(.inf)向cab向导提供应用程序描述。
● cab向导根据.inf文件所指出的处理器类型生成不同的.cab文件。
● .cab文件,一个自定义***组件和一个Setup.ini文件被打包成一个.msi文件。
下面的图表说明与***开发过程相关的各部分,接下来是每个部分的描述信息。
图5.与***开发过程的相关部分
BuildCab.bat文件通过运行Cab向导工具生成特定处理器的.cab文件。当你从生成菜单上选择生成cab文件时, Visual Studio生成一个模板BuildCab.Bat文件。让Microsoft Visual Studio生成这个文件,然后拷贝它到一个不同的路径,然后做一些更改是一个好办法。很有可能,仅有的改变是为.cab和log文件指定一个新的路径。示例中的BuildCab.Bat如下所示。
C:\Program Files\Microsoft Visual Studio .NET 2003\CompactFrameworkSDK\v1.0.5000\Windows CE\..\bin\..\bin\cabwiz.exe" "c:\program files\pocketpc deploy sample\Source\CS\PocketA \BuildCa \PocketA _PPC.inf" /dest "c:\program files\pocketpc deploy sample\Source\CS\PocketA \BuildCa \Ca " /err CabWiz.PPC.log /cpu ARMV4 ARM SH3 MIPS X86 WCE420X86
信息文件(.inf)
Microsoft Window reg; CE .NET .inf文件向cab向导指定了***设置和应用程序文件。如buildcab.bat文件,当生成cab文件被选择时,Visual Studio生成一个模板.inf文件。你应该首先用Visual Studio生成这个文件,然后拷贝到另外的路径去做一些更改。这个文件通常需要很小的修改;通常修改Provider的名称就可以了。 Visual Studio生成一个.inf文件包含对vsd_setup.dll的引用。这个dll是用于版本检查以及假如Pocket PC没有正确的***.Net精简板,报告这个信息。把它包含在你的应用程序中是一个好注意,但为了更清晰,我们把它从示例代码中移除了。 例子程序中的.inf如下所示。你可以访问Microsoft Windows CE .NET: Creating an .inf File获取多信息。
Signature="$Windows NT$" Provider="Sample Company" CESignature="$Windows CE$" [CEStrings] A Name="PocketA " I tallDir=%CE1%\%A Name% [CEDevice] VersionMin=3.00 VersionMax=4.99 [DefaultI tall] CEShortcuts=Shortcuts CopyFiles=Files.Common [SourceDisksNames] 1=,"Common1",,"C:\Code\Microsoft\Pocket PC Whitepapers\Deployment\Code\CS\PocketA \obj\Release\" [SourceDisksFiles] PocketA .exe=1 [DestinationDirs] Files.Common=0,%I tallDir% Shortcuts=0,%CE2%\Start Menu [Files.Common] PocketA .exe,,,0 [Shortcuts] PocketA ,0,PocketA .exe,%CE11%
Cab向导
Cab向导(cabwiz.exe)生成.cab文件,该文件可以被***在不同的Pocket PC设备上。一个.inf文件作为命令行的第一个参数传递,用于向向导描述应用程序。其它可选参数为目的路径,错误日志文件,和CPU类型。你可以访问You can visit Microsoft Windows CE .NET: CAB Wizard Syntax获取更多的信息。
***组件
自定义***组件通过处理AfterI tall和AferUnI tall事件以及运行WinCE应用程序管理器实现部署过程自动化。WinCE应用程序管理器的路径存储在注册表HKLM\software\Microsoft\Windows\CurrentVersion\A Paths\CEA Mgr.exe健值下。下面是AfterI tall和AferUnI tall事件的代码。
private void I taller_AfterI tall(object sender, System.Configuration.I tall.I tallEventArgs e) { // get fullpath to .ini file string arg = Path.Combine( Path.GetDirectoryName(A embly.GetExecutingA embly().Location), "Setup.ini"); // run WinCE A Manager to i tall .cab file on device RunA Manager(arg); } private void I taller_AfterUni tall(object sender, System.Configuration.I tall.I tallEventArgs e) { // run a manager in uni tall mode (without any arguments) RunA Manager(null); } private void RunA Manager(string arg) { // get path to the a manager co t string RegPath = @"Software\Microsoft\Windows\" + @"CurrentVersion\A Paths\CEA Mgr.exe"; RegistryKey key = Registry.LocalMachine.OpenSubKey(RegPath); string a Manager = key.GetValue("") as string; if (a Manager != null) { // launch the a Proce .Start( string.Format("\"{0}\"", a Manager), (arg == null) ? "" : string.Format("\"{0}\"", arg)); } else { // could not locate a manager Me ageBox.Show("Could not launch the WinCE A lication Manager."); } }
Private Sub I taller_AfterI tall(ByVal sender As Object, _ ByVal e As System.Configuration.I tall.I tallEventArgs) _ Handles MyBase.AfterI tall ' get fullpath to .ini file Dim arg As String = Path.Combine(Path.GetDirectoryName( _ System.Reflection.A embly.GetExecutingA embly().Location), _ "Setup.ini") ' run WinCE A Manager to i tall .cab file on device RunA Manager(arg) End Sub Private Sub I taller_AfterUni tall(ByVal sender As Object, _ ByVal e As System.Configuration.I tall.I tallEventArgs) _ Handles MyBase.AfterUni tall ' run a manager in uni tall mode (without any arguments) RunA Manager(Nothing) End Sub Private Sub RunA Manager(ByVal arg As String) ' get path to the a manager Co t RegPath As String = "Software\Microsoft\Windows\" &am _ "CurrentVersion\A Paths\CEA Mgr.exe" Dim key As RegistryKey = Registry.LocalMachine.OpenSubKey(RegPath) Dim a Manager As String = CStr(key.GetValue("")) If Not (a Manager Is Nothing) Then If arg Is Nothing Then Proce .Start(String.Format("""{0}""", a Manager)) Else ' launch the a Proce .Start( _ String.Format("""{0}""", a Manager), _ String.Format("""{0}""", arg)) End If Else ' could not locate a manager Me ageBox.Show("Could not find a manager") End If End Sub
Setup.ini文件
.ini文件用于在WinCE应用程序管理器向Pocket PC设备部署应用程序时,描述应用程序信息。下面所示的是Setup.ini的例子。你应该在你的应用程序中设置Version,Description和CabFiles属性。你可以访问Microsoft Windows CE 3.0: Creating an .ini File for the A lication Manager 去获取更多的关于.ini文件的信息。
[CEA Manager]
Versio = 1.0
Component = A [A ]
Descriptio = Sample Pocket PC a lication.
CabFile = PocketA _PPC.X86.CAB,PocketA _PPC.ARM.CAB,PocketA _PPC.ARMV4.CAB, PocketA _PPC.MIPS.CAB,PocketA _PPC.SH3.CAB,PocketA _PPC.WCE420X86.CAB
.msi文件
这是分发给用户的文件。它包含了从桌面向不同的Pocket PC部署Pocket PC应用程序所必要的模块。
***过程自动化
现在你已经熟悉了与***开发过程相关的所有模块。让我们看一下生成过程如何自动化。要点如下:
● 创建一个包含多工程的解决方案(Pocket PC a , customer i taller, 和 setup)。
● 把自定义的***组件加入***过程的***和卸载自定义动作中。
● 用一个预生成事件去调用BuildCab.bat文件去生成.cab文件。
● 指定项目的依赖性以使项目按正确的顺序生成。
● 用配置管理器设置生成Pocket PC程序的Debug配置和Release配置。
下面的部分更加详细的描述了C#和VB.Net例子解决方案。C#解决方案点一下鼠标就生成所有的项目(Pocket PC应用程序,自定义***组件和.msi文件)。VB.Net版本需要更多步骤,由于VB.Net缺少这两个属性:
1. 一个解决方案不能包括不同平台的VB.Net项目(Pocket PC应用程序不能和自定义***组件在同一个解决方案中)。
2. 预生成和后生成命令事件在任何VB.Net工程中都是不支持的。
VB.Net方案仍就可以实现自动化的,只是比不上C#版本便捷而已。
解决方案和项目
C#解决方案包含三个项目:PocketPC A , Custom I taller 和 Setup。PocketPC A 项目是一个基于Pocket PC的智能设备应用程序。Custom I taller项目是一个自定义***组件。***项目把所有的项目打包成一个.msi文件。下面显示的是C#解决方案。
图6.包含PocketPC A , Custom I taller 和 Setup项目
VB.Net需要两个解决方案。第一个包括智能设备项目PocketA 。第二个解决方案生成一个.msi文件,包括CustomI taller, Pre-Build 和 Setup项目。CustomI taller和Setup项目与C#中的项目相同,预生成项目是一个C++ Makefile项目;预生成项目并不包括任何C++代码,仅仅用于指定一个预编译事件。VB解决方案如下图。
图 7. 包含Pocket PC, i taller component, pre-build and setup projects的VB.Net解决方案
PocketA 项目
PocketA 是一个简单的智能设备项目,“Hello World”应用程序;一个PocketPC简单程序。BuildCab.bat和PocketA _PPC.inf文件用于生成.cab文件,Setup.ini文件用于部署应用程序。 文件a .ico是一个应用程序图标文件,显示在Pocket Pc的程序工作组中。下面显示的是在C#和VB.Net中指定应用程序图标。
图8.在C#中指定应用程序图标
图9.在VB.Net中指定应用程序图标
图10.显示在Pocket PC应用程序组中的图标
CustomI taller项目
这个组件运行WinCE应用程序管理器,让其部署.cab文件到Pocket PC设备上。C#和VB.Net的代码已经早在上文中说明了。
Setup项目
***项目生成一个.msi文件包括特定处理器的.cab文件,CustomerI taller***组件和setup.ini文件。CustomerI taller组件添加进来作为I tall和UnI tall自定义动作的响应,如下图所示
图11.添加I tall和UnI tall自定义动作的响应
预生成事件
在PocketA 项目生成后,你需要运行BuildCab.bat生成.cab文件。Visual Studio不允许你为C#智能设备项目指定生成后命令事件。所以我们最好为CustomerI taller项目指定一个预生成命令事件。
图 12.用一个预生成命令事件去在C#中生成.cab文件
Visual Studio不允许VB.Net项目有任何生成事件,所以我们用一个C++ Makefile工程去定义预生成事件,如下图所示。
图 13.用一个C++预生成事件作为VB.Net的解决方法
项目依赖
由于解决方案包含许多工程,所以设置正确的生成顺序是很重要的。对于C#,生成顺序设置为PocketA ,CustomeI taller 和 Setup,如下图所示。
图 14.为C#解决方案设置生成顺序
VB.Net版本包含有两个解决方案;PocketA 解决方案应首先生成,接下来是PocketPCSetup解决方按。Setup解决方案的生成顺序如下图所示。
图 15.指定VB.Net解决方案的生成顺序
配置管理器
配置管理器用于生成Pocket PC项目在Debug模式和所有的程序在Release模式。就是说,仅为调试应用程序Pocket PC应用程序,你不用经历整个生成过程。C#版本的配置图示如下。 这个配置在VB.Net中不需要,因为其中的一个解决方案是对于Pocket PC的,另外一个解决方案用于生成.msi文件。
图 16.仅生成Pocket PC项目在Debug模式
图 17.生成所有的项目于Release模式
***和生成示例解决方案
下面是***和生成示例解决方案的注意点。
● 运行PocketPC部署程序Sample.msi文件,***C#和VB.Net到你的系统中。指向Visual Studio解决方案文件的链结添加在开始菜单中的PocketPC Deploy Sample组下面。
● 在BuildCab.bat和PocketA _PPC.inf文件中的硬编码被更新以与你的系统匹配(例子***文件夹和Visual Studio的路径)。你应该多检查这些文件的路径信息,如果你生成示例程序的时候遇到困难。
● 选择Release模式生成所有的项目(Debug模式只生成Pocket PC应用程序)。
● .msi文件命名为PocketA Setup.msi,在Setup\Release文件夹下创建。
引文来源 ( Sun, 13 Feb 2011 20:04:04 +0800 )
Description:
Visual Studio2005支持诸如Pocket PC和Smartphone等Windows移动应用程序的开发。但是,当一个程序开发完了之后,如何将它部署到用户的设备上呢?在Visual Studio2005中,部署程序到设备上,只需要使用ActiveSync将设备连接到开发机器上并且按下F5即可。但是这种方法对于终端用户来说还是难以接受的,因为他们习惯了使用GUI方式的***程序来隐藏***过程细节。
在本文里,你将学习如何为你的Windows移动应用程序创建CAB文件使得它们可以方便的部署到你的Window移动设备上。你也将学习如何自定制一个***包,使得终端用户可以通过台式机上的***程序来部署程序到Windows移动设备上。
下面是你为一个Windows移动应用程序创建***包时所需要执行的步骤的概览:
·创建Windows移动应用程序
·将该程序打包为CAB文件
·创建一个自定制的***程序来***该Windows移动应用程序
·创建一个setup.ini文件来描述这个Windows移动应用程序及其相关的CAB文件
·创建一个Setup工程来打包CAB文件,自定制的***程序和setup.ini文件
创建应用程序
本文我使用Visual Studio2005创建了一个简单的Windows Mobile5.0的应用程序,用来演示部署功能。如果你也想和我一起学习这个demo,在VS中创建一个新的设备应用程序工程并且命名其为C:\SampleA ,如图1所示。为了简单起见,这个程序只包含一个按钮控件,当点击时会弹出"Hello Packet PC World!"的消息框。这个程序的内容不重要,我只是演示如何部署它。
打包CAB文件
部署这个工程的第一步是将这个应用程序打包为一个Cabinet(CAB)文件。CAB文件可以被部署到设备上,然后解开并***。CAB文件是一个可执行的压缩文件,其中包含了你的应用程序,其他相关的DLL文件,资源,帮助文件和其他你所要包含的文件。
在这一步里我不但会创建本程序的CAB文件,我还将进行相关配置,从而在***程序的时候,一个快捷方式将会被创建在用户的开始菜单里。创建一个新的工程,选择File-Add Project。在工程类型栏中,展开Other Project Types节点,选择Setup and Deployment。选择Smart Device CAB Project模板。将新建工程命名为C:\SmartDeviceCab1,点击确定。
在Solution Explorer中,点击SmartDeviceCab1工程,设置ProductName属性为MySampleA ,如图2所示。这将会是你将程序***到PocketPC上的文件夹的名字。
在Solution Explore中右键点击SmartDeviceCab1,选择Properties。设置输出文件名为Debug\SampleA .cab,如图3。这是CAB文件的名称和存放位置。
下一步就是对CAB文件进行配置,确定它被部署到用户的PocketPC上时将如何***。这里,我将为该程序在用户的PocketPC的开始菜单中添加一个快捷方式,这样用户可以直接从开始菜单里启动程序。
在文件系统面板里,右键点击A lication Folder并且选择Add-Project Output…在Add Project Output Group窗口,选择Primary output,点击确定。
右键点击Primary output from SampleA ,选择Create Shortcut to Primary output from SampleA (Active),如图4。Primary output指的是将要从Samplea .cab中释放出来的应用程序,这里我们给它添加一个快捷方式。
将缺省的快捷方式改名为"SampleA v1."这将是终端用户开始菜单里将要显示的快捷方式的名称(你将在下一步中创建快捷方式)。
在当前窗口里,右键点击File System on Target Machine,选择Add Special Folder-Start Menu Folder。
在当前窗口中SampleA v1的快捷方式应该是可见的了。拖动它到Start Menu Folder。这个目录看起来应该如图6所示。这一步骤完成的工作是在程序***时在用户的PocketPC的开始菜单中创建一个快捷方式。
下一步是创建CAB文件。进入到Build-Build SmartDeviceCab1来创建CAB文件工程。CAB文件其实是一个***程序,但是只有对计算机技术有很多了解的人才知道怎么作。下一步的工作是创建一个和普通的PC上***程序类似的基于窗口样式的***程序。
创建自定制的***程序
上一步中我们创建了CAB文件。其实从技术上来说这已经解决了***问题。但是用户仍然需要知道如何将CAB文件传输到Pocket PC上,然后使用触笔来点击CAB文件启动***过程。一个更好的方法是创建一个Windows***程序来自动化***过程。这样做的话,你需要写一些代码来启动Windows CE A Manager。A Manager是ActiveSync(用来在Pocket PC和计算机之间进行同步的程序,工作在Windows移动设备上,如Pocket PC和Smartphone)的一个部分,在Pocket PC上完成程序***的任务。
开始,在当前的solution中添加一个新的工程(File-Add Project)…点击Windows project type选择Cla Library模板。给工程命名为CustomI taller并且点击确定。
你需要给你的工程添加两个引用。在Solution Explore中右键点击CustomI taller,并且选择Add Reference…需要添加的是System.Configuration.I tall和System.Windows.Forms。System.Configuration.I tall命名空间提供了允许你为自己的组件编写自定制的***文件的类,而System.Windows.Forms命名空间则提供了允许你通过Windows UI来和用户进行交互(如Me agebox等)的相关类。
在Solution Explorer中双击Cla 1.vb,在文件中填入下列代码--SetupA 类:
orts System.Windows.Forms
orts System.Diagnostics
orts System.Reflection
orts System.IO
orts Microsoft.Win32
System.ComponentModel.RunI taller(True) _
Public Cla SetupA Inherits System.Configuration.I tall.I taller
Private Co t INI_FILE As String = "\setup.ini"
Private Sub I taller_AfterI tall(ByVal sender As Object, _
ByVal e As System.Configuration.I tall.I tallEventArgs) _
Handles MyBase.AfterI tall
'---to be executed when the a lication is i talled---
Dim ceA Path As String = GetWindowsCeA licationManager()
If ceA Path = String.Empty Then
Return
End If
Dim iniPath As String = GetIniPath()
Proce .Start(ceA Path, iniPath)
End Sub
Private Sub I taller_AfterUni tall(ByVal sender As Object, _
ByVal e As System.Configuration.I tall.I tallEventArgs) _
Handles MyBase.AfterUni tall
'---to be executed when the a lication is uni talled---
Dim ceA Path As String = GetWindowsCeA licationManager()
If ceA Path = String.Empty Then
Return
End If
Dim iniPath As String = GetIniPath()
Proce .Start(ceA Path, String.Empty)
End Sub
Public Shared Function GetWindowsCeA licationManager() As String
'---check if the Windows CE A lication Manager is i talled---
Dim ceA Path As String = KeyExists()
If ceA Path = String.Empty Then
Me ageBox.Show("Windows CE A Manager not i talled", _
"Setup", Me ageBoxButto .OK, _
Me ageBoxIcon.Error)
Return String.Empty
Else
Return ceA Path
End If
End Function
Public Shared Function GetIniPath() As String
'---get the path of the .ini file---
Return """" &am _
Path.Combine(Path.GetDirectoryName( _
System.Reflection.A embly. _
GetExecutingA embly().Location), "Setup.ini") &am """"
End Function
Private Shared Function KeyExists() As String
'---get the path to the Windows CE A Manager from the registry---
Dim key As RegistryKey = _
Registry.LocalMachine.OpenSubKey( _
"SOFTWARE\Microsoft\Windows\CurrentVersion\A Paths\CEAPPMGR.EXE")
If key Is Nothing Then
Return String.Empty
Else
Return key.GetValue(String.Empty, String.Empty)
End If
End Function
End Cla 这个类里包含了调用Windows CE A Manager应用程序的代码,从而使得你的应用程序可以通过ActiveSync***到用户的Pocket PC上。
SetupA 类包含了2个事件和3个方法:
·I taller_AfterI tall事件:在***过程启动后事件触发
·I taller_AfterUni tall事件:在反***过程启动后事件触发
·GetWindowsCeA licationManager:返回包含Windows CE A Manager的路径
·GetIniPath:返回Setup.ini文件的路径
·KeyExists:通过 注册表检查当前机器上是否有Windows CE A Manager可用。
SetupA 继承了I taller类,并且将RunI tallerAttribute属性设置为true(System.ComponentModel.RunI taller(True))。因此,Visual Studio的自定制***程序或I tallUtil.exe将在程序***时被触发。在***时,SetupA 类首先检查是否当前系统里有Windows CE A Manager。如果有的话,程序将会通过Windows CE A Manager***。(注:如果需要详细了解如何在.NET中创建自定制的***程序,请查阅Building Custom I taller Cla es in .NET)。
当添加了这个类之后,就可以创建自定制的***程序工程了。右键点击Solution Explorer中的CustomI taller,并且选择Build。
创建.ini文件
下一步就是创建一个ini文件来描述你要部署的程序。这个信息将会被Windows CE A Manager使用。
用记事本程序编辑一个setup.ini文件,将它保存在C:\CustomI taller\目录下。
[ceA Manager]
Version = 1.0
Component = SampleA [SampleA ]
Description = Sample A lication
Uni tall = SampleA CabFiles = SampleA .cab
(注:MSDN有一篇很好的参考文献,详细解释了ini文件不同的域的内容)
创建Setup包
在ini文件创建之后,最后一步就是创建一个setup工程来打包所有你早先创建的文件。在当前的solution中添加一个新的工程, File-Add Project…。
点击Setup and Deployment工程类型,选择Setup Project。给工程命名为Setup,点击确定。在Solution Explorer里右键点击Setup,选择Add-File…给工程添加如下文件(如图7):
· C:\CustomI taller\bin\Debug\CustomI taller.dll
· C:\SmartDeviceCab1\Debug\SampleA .CAB
· C:\CustomI taller\setup.ini
右键点击Solution Explorer中的Setup并选择View-Custom Actio 。这样会显示所支持的各种自定义动作的类型。自定义工作编辑器允许你指定在***过程结束后在目标计算机上所要执行的动作。在下一步中你要使用自定义动作的I tall类型,它将创建***程序。在Custom Actio 面板里,右键点击I tall选择Add Custom Act
ion…,如图8。
这个动作将会触发一个对话框窗口弹出,在"Look in"下拉框中,选择A lication Folder,图9所示。你可以看到list中的CustomI taller.dll。选择它并点击确定。这将会将自定义的***程序和setup程序联系起来。
这时你所作的仅是右键点击Solution Explorer中的Setup并且在弹出菜单中选择Build即可。
测试***
就是它了!你现在可以测试你做好的***程序了,进入C:\Setup\Debug,双击Setup,如图10。在此以前,请确认你的Pocket PC已经通过ActiveSync连接到你的电脑上了。
你将会被询问***路径;使用缺省的或者你喜欢的目录点击下一步。按照屏幕上显示的指令去做,如果所有的东西都被配置正确的话,你将会看到从Windows CE A Manager返回的消息,如图11。这个消息提示你检查一下你的移动设备的屏幕来确认***过程成功。
从图12上你可以看到,通过ActiveSync的连接,你现在已经成功的将程序***到你的Pocket PC上了。
小提示:注意如果开始菜单比较满包含了很多项,那么"SampleA v1"项不会出现在开始菜单;而是会出现在程序目录里,如图13。当然,你可以通过ActiveSync来进入\Windows\Start Menu\目录,删除掉不需要的项和快捷方式以及其他任何文件。
结束语
为你的用户创建一个更好的***体验看起来像是一件很"多余"的事情,但是你最好是将它作为必不可少的一件事。这样可以帮助更多的用户来使用你的程序-减少不熟悉使用移动设备的用户向***求助的次数。这篇文章介绍了如何在Pocket PC平台上部署一个移动程序所要做的主要步骤。这些步骤当然也可以被用来部署Smartphone应用程序,尽管Smartphone也可以通过其他更通用的方式来部署--如通过web服务器和SMS等。
发评论
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。
新浪BLOG意见反馈留言板 不良信息反馈 ***:4006900000 提示音后按1键(按当地市话标准计费) 欢迎批评指正
新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑
Copyright 1996 - 2011 SINA Corporation, All Rights Reserved
引文来源 ( Sun, 30 Jan 2011 22:00:14 +0800 )
Description:
51CTO技术论坛_中国领先的IT技术社区 服务器硬件 解答手动加载阵列卡驱动。
解答手动加载阵列卡驱动。
解答手动加载阵列卡驱动。
关于之前网友“jayctu”提到的关于阵列卡信息,现在提供几个步骤供你参考,各位网友如果需要的话也可以参考此方法。
一般IBM的X服务器***的话,新机器都会选择使用SERVERGUIDE来进行***,但是如果你的机器已经在用,但因为某些原因需要重装系统的话,用serverguide的话是行不通的,不是说不能用,只是原来的阵列等信息会丢失,所以如果手动去加载阵列卡的话,就只需要格式化C盘就好了,别的盘信息会保留下,那么看看怎么来做吧,根据下面的步骤:
先提醒大家,手动加载阵列卡的话,如果准备一个USB移动软驱,一个软盘(其他的比如U盘等介质,我们暂时还没有试过,不知道行不行。)
1)首先到官方网站把阵列卡驱动下载下来,之前我有个官网的连接,可是现在连接失效了,可能大家要自己上去找找看了,到英文网站去下吧,因为那么可以根据系列来选择。
2)下载下来之后,是一个EXE文件,运行它,其实就是解压出来,附图:
2)然后找到解压出来的文件,找到对应型号的文件夹,打开(注意操作系统的选择):
3)然后把对应阵列卡型号的文件夹内的所有文件,发送到之前接上的软驱中,当然也可以COPY过去。
4)OK了,就用***光盘引导启动吧,看到此画面就按F6。
5)等个分来钟,就可以看到以下画面,按"S"加载额外驱动,"ENTER"是不加载驱动,我们按"S"
6)选择加载额外驱动后,出现以下画面了,画面是提示要你插入之前做好的阵列卡驱动的软盘,然后按“ENTER”继续。
7)然后就会出现了阵列卡的驱动,按"ENTER"选中阵列卡。
8)然后出现以下画面,"S"是选择软盘中的驱动,“ENTER”是选择WINDOWS的默认驱动,当然按"S"啊。
9)好了,然后会提示你是否需要再加载别的启动,如果不需要再加载别的驱动的话,就按"ENTER"继续。
10)然后就跟平常装系统一样了,可以按"ENTER"继续***。
11)然后选择F8同意,之后就跟平常没有区别,如果你加载了的话,之后会现时出***的分区,比如C.D.E什么的,会问你***在哪个盘,要不要格式化之类的了,如果不手动加载的话,你之前的分区等信息都看不到了。
这样就完成阵列卡驱动的手动加载了,可以试试看,希望对大家有帮助。
搜索更多相关主题的帖子: 阵列卡 驱动 加载 解答
拈朵微笑的花,看一番人世繁华 整合驱动程序到系统***盘-图片多是因为适应不同用户的需求,其实操作过程很简单,也就是点几下鼠
标的事。当我们在使用SATA、SCSI硬盘或磁盘阵列的电脑***系统,需要在***程序检测磁盘设备时按下
F6键,插入软盘为操作系统提供 磁盘设备的驱动程序,如果你的电脑上没有软盘驱动器则无法开始***。要
避免类似的麻烦,可以将磁盘设备的驱动程序整合到操作 系统的***光盘上,又或者整合更多驱动程序,让
操作系统在***时自动***。
整合驱动需要两个软件:nLite和Microsoft .NET Framework Version 2.0 通过工具软件将驱动程序整合到操作
系统***光盘,主要使用nLite
( )
nLite软件可以运行于Windows 2000/XP/2003等操作系统,并要求系统上已***Microsoft .NET Framework Version 2.0,可以先***软件,如果提示没有*** ,再从以下链接下载***: 如果以上的地址不行,请用下面这个地址:
如何使用nlite整合驱动 ***好nLite软件后,在一个可用空间充足的磁盘上建立一个新的文件夹,例如WIN2K3,并将系统***光盘上的所有文件与文件夹拷 贝到该文件夹中。再将要整合到系统***光盘上的驱动程序下载也准备好,如果驱动程序是压缩文件包需要将它们解压缩,拷贝到一 个目录,如:driver。
驱动下载列表: 一切都准备妥当后启动nLite,如果希望使用中文操作界面,启动后可以在软件向导式的操作界面第一步的下拉菜单中选择 “Simplified Chinese”软件将马上转为简体中文操作界面。
接下来,nLite将要求你选择操作系统***文件夹所在路径,单击“浏览”按钮找到刚才拷贝的系统***光盘文件夹,
nLite将检测中该操作系统的版本等具体信息
接下来会问是否有以前备用的方案,选前进。
拈朵微笑的花,看一番人世繁华
再下来的一步,nLite将让你选择要执行的任务,必选的当然是“驱动整合”和“可引导ISO镜像”,也就是让nLite先让我们整合驱动,然后再生成一个可引导的ISO镜像,让我们刻录一张新的***光盘。而你也可以按照自己的需要增加一些选项,对***光盘做进一步的改造。
接下来,nLite将根据你选择的任务逐一执行,在“驱动整合”的步骤,你需要单击右下方的“插入”按钮,选择要增加到***光盘上的驱动程序中的“INF”文件,将它们逐一整合到光盘上。注意如果驱动程序有适用于各种操作系统的版本,你需要选择适用于当前整合的操作系统版本中的“INF”文件。最后,你还可以根据自己的需要,通过“驱动整合”设置对话框左下方的“在***后删除”复选框,设定当前整合的驱动程序是在***之后就自动删除,还是让驱动程序在***之后仍然保留在新系统的驱动程序缓冲文件夹中。
拈朵微笑的花,看一番人世繁华
在所有的设置完成之后,nLite将开始对操作系统的***光盘内容进行修改,并生成一个可引导的ISO光盘镜像文件,你可以将其刻录成光盘,或先在虚拟机软件上调入测试是否需要再调整。
拈朵微笑的花,看一番人世繁华
拈朵微笑的花,看一番人世繁华
当前时区 GMT+8, 现在时间是 2011-1-30 21:58
清除 Cookies - 联系我们 - 无忧创想 - Archiver - WAP - TOP - 界面风格
Powered by
Discuz!
6.1.0 2001-2008 Comsenz Inc.
引文来源 ( Tue, 17 Aug 2010 08:54:33 +0800 )
Description:
无线网络技术的发展日新月异,各种802.11x标准不断被更新,新的无线网络架构和技术也不断被提出。正当无线局域网(WLAN)的发展方兴未艾时,一种新的无线Mesh网络(无线网状网络)又出现了。无线Mesh网络的核心指导思想是让网络中的每个节点都可以发送和接收信号,传统的WLAN一直存在的可伸缩性低和健壮性差等诸多问题由此迎刃而解。无线Mesh技术的出现,代表着无线网络技术的又一大跨越,有极为广阔的应用前景。
什么是无线Mesh网络?
无线Mesh网络(无线网状网络)也称为“多跳(multi-hop)”网络,它是一种与传统无线网络完全不同的新型无线网络技术。
在传统的无线局域网(WLAN)中,每个客户端均通过一条与AP相连的无线链路来访问网络,用户如果要进行相互通信的话,必须首先访问一个固定的接入点(AP),这种网络结构被称为单跳网络。而在无线Mesh网络中,任何无线设备节点都可以同时作为AP和路由器,网络中的每个节点都可以发送和接收信号,每个节点都可以与一个或者多个对等节点进行直接通信。
这种结构的最大好处在于:如果最近的AP由于流量过大而导致拥塞的话,那么数据可以自动重新路由到一个通信流量较小的邻近节点进行传输。依此类推,数据包还可以根据网络的情况,继续路由到与之最近的下一个节点进行传输,直到到达最终目的地为止。这样的访问方式就是多跳访问。
目前cisco的mesh产品可以根据链路信噪比和跳数综合动态判断路由,实际上也就是选择带宽、延时最好的一条路径,最后成型的网络是一个树形结构。我认为还没有哪个厂家会根据流量来重新路由,事实上在internet上也不会这么去做。因为已经选择的路径是带宽最好的,不可能在拥塞的情况下去选用带宽更差的一条路径。
其实人们熟知的Internet就是一个Mesh网络的典型例子。例如,当我们发送一份E-mail时,电子邮件并不是直接到达收件人的信箱中,而是通过路由器从一个服务器转发到另外一个服务器,最后经过多次路由转发才到达用户的信箱。在转发的过程中,路由器一般会选择效率最高的传输路径,以便使电子邮件能够尽快到达用户的信箱。
与传统的交换式网络相比,无线Mesh网络去掉了节点之间的布线需求,但仍具有分布式网络所提供的冗余机制和重新路由功能。在无线Mesh网络里,如果要添加新的设备,只需要简单地接上电源就可以了,它可以自动进行自我配置,并确定最佳的多跳传输路径。添加或移动设备时,网络能够自动发现拓扑变化,并自动调整通信路由,以获取最有效的传输路径。
Mesh网络的五大优势
与传统的WLAN相比,无线Mesh网络具有几个无可比拟的优势:
1.快速部署和易于***。***Mesh节点非常简单,将设备从包装盒里取出来,接上电源就行了。由于极大地简化了***,用户可以很容易增加新的节点来扩大无线网络的覆盖范围和网络容量。在无线Mesh网络中,不是每个Mesh节点都需要有线电缆连接,这是它与有线AP最大的不同。 Mesh的设计目标就是将有线设备和有线AP的数量降至最低,因此大大降低了总拥有成本和***时间,仅这一点带来的成本节省就是非常可观的。无线Mesh 网络的配置和其他网管功能与传统的WLAN相同,用户使用WLAN的经验可以很容易应用到Mesh网络上。
2.非视距传输(NLOS)。利用无线Mesh技术可以很容易实现NLOS配置,因此在室外和公共场所有着广泛的应用前景。与发射台有直接视距的用户先接收无线信号,然后再将接收到的信号转发给非直接视距的用户。按照这种方式,信号能够自动选择最佳路径不断从一个用户跳转到另一个用户,并最终到达无直接视距的目标用户。这样,具有直接视距的用户实际上为没有直接视距的邻近用户提供了无线宽带访问功能。无线Mesh网络能够非视距传输的特性大大扩展了无线宽带的应用领域和覆盖范围。
3.健壮性。实现网络健壮性通常的方法是使用多路由器来传输数据。如果某个路由器发生故障,信息由其他路由器通过备用路径传送。E-mail就是这样一个例子,邮件信息被分成若干数据包,然后经多个路由器通过Internet发送,最后再组装成到达用户收件箱里的信息。Mesh网络比单跳网络更加健壮,因为它不依赖于某一个单一节点的性能。在单跳网络中,如果某一个节点出现故障,整个网络也就随之瘫痪。而在Mesh网络结构中,由于每个节点都有一条或几条传送数据的路径。如果最近的节点出现故障或者受到干扰,数据包将自动路由到备用路径继续进行传输,整个网络的运行不会受到影响。
4.结构灵活。在单跳网络中,设备必须共享AP。如果几个设备要同时访问网络,就可能产生通信拥塞并导致系统的运行速度降低。而在多跳网络中,设备可以通过不同的节点同时连接到网络,因此不会导致系统性能的降低。
Mesh网络还提供了更大的冗余机制和通信负载平衡功能。在无线Mesh网络中,每个设备都有多个传输路径可用,网络可以根据每个节点的通信负载情况动态地分配通信路由,从而有效地避免了节点的通信拥塞。而目前单跳网络并不能动态地处理通信干扰和接入点的超载问题。
5.高带宽。无线通信的物理特性决定了通信传输的距离越短就越容易获得高带宽,因为随着无线传输距离的增加,各种干扰和其他导致数据丢失的因素随之增加。因此选择经多个短跳来传输数据将是获得更高网络带宽的一种有效方法,而这正是Mesh网络的优势所在。
这一条我还没有实际比较的经验,似乎不一定能成立,因为每多一跳,带宽(throughput)都会减少。
在Mesh网络中,一个节点不仅能传送和接收信息,还能充当路由器对其附近节点转发信息,随着更多节点的相互连接和可能的路径数量的增加,总的带宽也大大增加。
总的带宽目前来看,是取决于根节点的多少。根节点越多,总的带宽越大。
此外,因为每个短跳的传输距离短,传输数据所需要的功率也较小。既然多跳网络通常使用较低功率将数据传输到邻近的节点,节点之间的无线信号干扰也较小,网络的信道质量和信道利用效率大大提高,因而能够实现更高的网络容量。比如在高密度的城市网络环境中,Mesh网络能够减少使用无线网络的相邻用户的相互干扰,大大提高信道的利用效率。
Mesh网络的不足
尽管无线Mesh联网技术有着广泛的应用前景,但也存在一些影响它广泛部署的问题。
1.互操作性。目前影响无线Mesh技术迅速普及的一个重要障碍就是互操作性。正如任何一种新兴的网络技术刚出现时一样,无线Mesh网络现在还没有一个统一的技术标准,用户现在要么就只能使用某一个厂商的无线Mesh产品,要么面临如何与各种不同类型的嵌入式无线设备接口的问题,这个问题目前是影响无线Mesh技术推广使用最重要的原因。鉴于此,目前一些公司正在开发能够适应不同无线环境的可配置的无线网络设备,互操作性有望得到一定程度的解决。但要想彻底解决互操作性问题,最终还需要业界制定统一的无线Mesh技术标准。
的确,802.1s协议至今没有确立下来。
2.通信延迟。既然在Mesh网络中数据通过中间节点进行多跳转发,每一跳至少都会带来一些延迟,随着无线Mesh 网络规模的扩大,跳接越多,积累的总延迟就会越大。一些对通信延迟要求高的应用,如话音或流媒体应用等,可能面临无法接受的延迟过长的问题。目前解决这一问题主要是通过增加Mesh节点以及合适的网络协议。随着多无线Mesh节点技术的出现这一问题将得到最终解决。
目前这个问题并不严重,Cisco的Mesh产品每一跳延时小于10ms,通常在1~3ms。
3.安全。与WLAN的单跳机制相比,无线Mesh网络的多跳机制决定了用户通信要经过更多的节点。而数据通信经过的节点越多,安全问题就越变得不容忽视。Internet本身即是使用Mesh方式进行通信的典型,它的安全隐患是众所周知的。尽管有线网络中使用的各种端到端安全技术,如虚拟专用网(***)同样可以用来解决无线Mesh的安全问题。但正如Internet一样,无线Mesh网络的安全是一个不容忽视的问题。
Cisco的Mesh技术在AP与AP之间的回传链路上,有基于硬件的AES加密,保证了回传链路的数据安全。
客户端则与普通无线网络一样,采用WPA/WPA2,或者IPsec的方式来保证安全。
广泛的Mesh应用
Mesh网络在家庭、企业和公共场所等诸多领域都具有广阔的应用前景。
1.家庭
Mesh技术的一个重要用处就是用于建立家庭无线网络。家庭式无线Mesh联网可以连接台式PC机、笔记本和手持计算机、HDTV、DVD播放器、游戏控制台,以及其他各种消费类电子设备,而不需要复杂的布线和***过程。在家庭Mesh网络中,各种家用电器既是网上的用户,也作为网络基础设施的组成部分为其他设备提供接入服务。当家用电器增多时,这种组网方式可以提供更多的容量和更大的覆盖范围。Mesh技术应用家庭环境中的另外一个关键好处是它能够支持带宽高度集中的应用,如高清晰度视频等。
2.企业
目前,企业的无线通信系统大都采用传统的蜂窝***式无线链路,为用户提供点到点和点到多点传输。无线Mesh网络则不同,它允许网络用户共享带宽,消除了目前单跳网络的瓶颈,并且能够实现网络负载的动态平衡。在无线Mesh网络中增加或调整AP也比有线AP更容易、配置更灵活、***和使用成本更低。尤其是对于那些需要经常移动接入点的企业,无线Mesh技术的多跳结构和配置灵活将非常有利于网络拓朴结构的调整和升级。
3. 学校
校园无线网络与大型企业非常类似,但也有自己的不同特点。一是校园WLAN的规模巨大,不仅地域范围大,用户多,而且通信量也大,因为与一般企业用户相比学生会更多地使用多媒体;二是网络覆盖的要求高,网络必须能够实现室内、室外、礼堂、宿舍、图书馆、公共场所等之间的无缝漫游;三是负载平衡非常重要,由于学生经常要集中活动,当学生同时在某个位置使用网络时就可能发生通信拥塞现象。
解决这些问题的传统作法是在室内高密度地***AP,而在室外***的AP数量则很少。但由于校园网的用户需求变化较大,有可能经常需要增加新的AP或调整AP的部署位置,这会带来很大的成本增加。而使用Mesh方式组网,不仅易于实现网络的结构升级和调整,而且能够实现室外和室内之间的无缝漫游。
4. 医院
Mesh还为像医院这样的公共场所提供了一种理想的联网方案。由于医院建筑物的构造密集而又复杂,一些区域还要防止电磁辐射,因此是***无线网络难度最大的领域之一。医院的网络有两个主要的特点。一是布线比较困难: 在传统的组网方式中,需要在建筑物上穿墙凿洞才能布线,这显然不利于网络拓朴结构的变化。二是对网络的健壮性要求很高: 如果医院里有重要的活动(如手术),网络任何可能的故障都将会带来灾难性的后果。
采用无线Mesh组网则是解决这些问题的理想方案。如果要对医院无线网络拓扑进行调整,只需要移动现有的Mesh节点的位置或***新的Mesh节点就可以了,过程非常简单,***新的Mesh节点也非常方便。而无线Mesh的健壮性和高带宽也使它更适合于在医院中部署。
5.旅游休闲场所
Mesh非常适合于在那些地理位置偏远布线困难或经济上不合算,而又需要为用户提供宽带无线Internet访问的地方,如旅游场所、度假村、汽车旅馆等。Mesh能够以最低的成本为这些场所提供宽带服务。
6.快速部署和临时***
对于那些需要快速部署或临时***的地方,如展览会、交易会、灾难救援等,Mesh网络无疑是最经济有效的组网方法。比如,如果需要临时在某个地方开几天会议或办几天展览,使用Mesh技术来组网可以将成本降到最低。
显然对于运营商来说,Mesh也是很实用的技术。Mesh可以和城域网技术、WiMax技术结合起来,例如WiMax做远距离的无线传输,Mesh做小区覆盖。在将来Cisco可能也会推出带WiMax的Mesh产品。
( Tue, 17 Aug 2010 08:48:19 +0800 )
Description:
AP覆盖面积:
室内容许最大覆盖距离为35~100米
室外容许最大距离100~400米
AP覆盖范围:
2.4G电磁波对于各种建筑材质的穿透损耗的经验值如下:
A.水泥墙(15~25cm): 衰减10~12dB
B.木板墙(5~10cm): 衰减5~6dB
C.玻璃窗(3~5cm): 衰减5~7dB
各种建筑材料对无线讯号的影响如下:
当AP与终端隔一座水泥墙时, AP 的可传送覆盖距离约剩下 5米 有效距离。
当AP与终端中间隔一座木板墙时, AP 的传送距离约剩下 15米 有效距离。
当AP与终端中间隔一座玻璃墙时, AP 的传送距离约剩下 15米 有效距离
AP数量确定:
对于面积小于150平方米的普通开放空间,如酒店公共休息区,小酒吧,咖啡厅,会议室,西餐厅等区域,预计用户数量不超过30个时,每个场所放置一个AP即可满足需求
当空间较大,将以***多个AP来满足覆盖需求
当容量需求较大,即AP的覆盖区域内用户数目过多时,需在同一空间放置多个AP以增加容量
AP***位置选择:
单个房间中***一个AP,尽量把AP安放在大厅的中央位置,最好选择放置于大厅的天花板上
若***两个AP,可将其放置在大厅的两个对角上
AP频率规划:
在理论上,要求相邻频点的隔离度=35db。
根据经验值,当相邻AP设定相同频点时, 要求间隔25米以上;当相邻AP设定相邻频点时, 要求AP间隔16米以上;当AP设定相隔频点时, 要求间隔12米以上。
要维持一个质量较好的WLAN,需要考虑覆盖范围内用户数量,单个AP的联机终端用户数不应超过30个
AP间漫游:
AP每隔100ms发送一次探测信号,用户端可据此判断网络连接质量,然后决定接入哪一个AP。当终端在多个AP间的漫游时,由新的服务AP通过有线的形式通知原服务AP,已建立新的连接。
无线AP的漫游协议不包含在802.11中,而IAPP(Inter acce point protocol)很有可能成为标准的漫游协议。
AP功率控制:
通过对AP输出功率的调整,可以控制覆盖范围内的用户数量,以保证网络质量。
AP产品出厂时功率统一,当用户需要更改功率时,可下载相应软件,对输出功率进行调整。
在当前WLAN的建设初期,主要满足覆盖需求,较少对AP功率进行控制。
外界干扰:
干扰源的种类
微波炉
防盗设施(商场门检)
其它大功率的电子设备
所以AP应该远离干扰源1—2米
总结:
AP规划应遵循以下原则:
1、覆盖原则
首选保证信号的覆盖范围能够用户要求;
2、易***原则
规划选址应满足施工要求;
( Mon, 9 Aug 2010 11:24:50 +0800 )
Description:
时间:
2009-11-29 00:09
来源:
Exchange中文站
作者:
Exchange中文站
点击:
1153次
在Exchange 2003中没有具体的限制邮件附件大小的选项,但是,我们可以通过限制整个邮件大小的目地来实现限制附件的大小,限制邮件大小的方式有两种。
在Exchange 2003中没有具体的限制邮件附件大小的选项,但是,我们可以通过限制整个邮件大小的目地来实现限制附件的大小,限制邮件大小的方式有两种。 1、 通过全局设置来限制邮箱传递的整个邮件大小: 打开“Exchange系统管理器”左侧的“全局设置”中,找到“邮件传递”右键选择“属性”并切换到“默认设置”标签,在其中会看到“发送邮件大小”、“接收邮件大小”、“收件人限制”等相关的选项,按照需求,做相应的设置即可。 2、 通过AD中限制某个用户邮箱传递的大小: 在Exchange服务器上,打开AD的用户和计算机,找到想要限制的用户并右键“属性”,在“Exchange常规”选择“传递限制”: 在“传递限制”标签 中可同样可以查看到相应的对邮箱 大小的限制 : 通过以上的两种方法即可从通过限制邮件整体大小的方式来实现限制邮件附件大小的目的。
( Tue, 10 Feb 2009 13:54:51 +0800 )
Description:
在大多数单位,都是通过限制工作站的IP地址,控制其上网行为,例如,根据部门、人员的不同,为其分配不同的地址或者地址段,在防火墙(或代理服务器)中设置上网策略。但这样的设置,存在一些问题:
(1)因为知道网管对IP地址进行了限制,所以一些员工会将自己的IP地址改成不受限制的IP地址,以避开限制。这样,经常造成网络地址的冲突。
(2)为了解决员工随意修改IP地址的问题,需要将IP地址与MAC地址绑定。但这样需要对三层交换机进行调试,这样会增加网管的负担。另外,现在修改网卡的MAC地址也是非常容易的,这也不是解决问题的最终方法。
(3)如果只是通过IP地址限制上网,由于现在的笔记本电脑很多。如果外来人员,将随身携带的笔记本接入网络,设置一个IP地址,就可以访问外网,这样可能引发问题。
(4)当网络出现问题时,如果只是基于IP地址进行排查,不容易定位故障源:因为IP地址是可以随意设置的。
基于此,这种传统的、基于IP地址进行限制的上网行为,需要做出改进。
为了解决上述问题,本文介绍联合使用ISA Server、DHCP、DNS、Windows Server 2003 Active Directory的综合解决方案,达到让指定的用户、在指定的时间、以指定的流量、访问指定的网络,本方案对用户身份进行验证,不对IP进行限制。即使用户修改IP地址,也不会避开限制。本方案网络拓扑如图1所示。
图1 网络拓扑
解决思路如下:
(1)在网络中需要有一台Windows Server 2003的服务器,升级到Active Directory(域),用于提供身份验证。所有的工作站需要加入该域。ISA Server是该域的“成员服务器”。
(2)网络中提供一台DHCP服务器,为工作站自动分配TCP/IP地址(可选)。
(3)在ISA Server中,创建访问策略时,采用“身份验证”方式,没有经过身份验证的计算机不能访问指定的网络(一般是访问Internet)。
(4)因为ISA Server 2004、ISA Server 2006没有提供“流量”限制功能,可以采用第三方的软件“Bandwidth Splitter for Microsoft ISA Server”软件,提供流量限制功能。
(5)所有的工作站,在访问Internet时,需要采用“Web代理方式”或“ISA Server的防火墙客户端”,否则不能通过“身份验证”,也就不能访问外网。
为了统一起见,网络中重要服务器的参数如下:
Active Directory服务器的IP地址为192.168.7.7,ISA Server服务器的“内网”地址为10.10.0.1(三层交换机的默认路由所指定的地址),外网地址为61.182.x.y;DHCP服务器的地址为192.168.7.6(三层交换机中设置“DHCP中继代理的”地址)。所有的工作站采用192.168.1.0/24~192.168.6.0/24的网段,DNS地址设置为192.168.7.7。
在ISA Server中,使用“Web代理客户端”与“防火墙客户端”,可以通过身份验证。下面分别介绍一下这两种客户端的设置方法。
1 使用Web代理客户端上网
(1)在网络中一台Windows Server 2003的服务器上,将DNS地址设置成127.0.0.1,运行dcpromo,将计算机升级到Active Directory。在本例中,DNS域名为jz.local。升级到域之后,按照单位的组织机构创建OU、子OU(与部门名称相同),并在子OU中创建用户,如图2所示。
图2 根据组织结构创建OU与用户
(2)将ISA Server计算机加入到域。说明,不需要将计算机成为“额外的域控制器”,只要加入域,作“成员服务器”即可。然后按照传统的方式,设置访问策略,例如“允许内网访问外网”,即在创建规则时,允许“内部”用户访问“外部”,但在设置“用户”时,将默认的“所有用户”删除,而是添加“所有域用户”或者“所有经过身份验证的用户”,如图3所示。
图3 用户规则
这样,原来的只根据IP地址的限制,变成了IP地址+用户身份限制,但我们创建策略时,允许所有“内部”的用户,这样,起决定作用的就是“用户身份”了。
(3)在“配置→网络”中,双击“内部”,在打开的“内部 属性”页中,在“Web代理”选项卡中,选中“为此网络启用Web代理客户端连接”,并且选中“启用HTTP”,如图4所示。
图4 启用Web代理并指定代理端口
设置策略之后,单击“应用”按钮,让设置生效。
(4)返回到“Active Directory”服务器上,在“Active Directory用户和计算机”中,编辑该OU所在的策略,在“用户配置→Windows设置→Internet Explorer维护→连接”中,双击右侧的“代理设置”,在弹出的对话框中,选中“启用代理服务器设置”选项,在“HTTP”文本框中键入代理服务器的地址(在本例中为10.10.0.1)与端口(本例中为8080),如图5所示。
图5 编辑策略
(5)所有的工作站,加入到域之后,以域用户登录,其IE中的代理服务器地址,将会按照图5中的进行设置,并且可以访问Internet。如果没有加入到域,则不能访问Internet。
2 防火墙客户端设置
如果网络中的工作站,使用ISA Server的防火墙客户端的方式访问外网,除了需要按照上面进行设置外,还要进行下面的工作:
(1)在“防火墙客户端”页中,选中“启用此网络的防火墙客户端支持”与“使用Web代理服务器”两个选项,并且将“ISA服务器名称或IP地址”(两处)设置为ISA Server内网的IP地址,切记,不要用计算机的名称,如图6所示。
图6 设置ISA服务器的内网IP地址
(2)在工作站上,***ISA Server的防火墙客户端软件(在ISA Server***光盘的“Client”文件夹中,可以用组策略发布该软件)。***好后,双击右下角的“
”图标,在弹出的对话框中,在“设置”选项卡中,选中“手动指定的ISA服务器”文本框中,键入10.10.0.1,然后单击“测试服务器”、“确定”按钮即可,如图7所示。
图7 指定ISA Server服务器地址
如果不想让用户指定ISA Server服务器的地址,则可以使用ISA Server提供的“自动发现”功能。这需要进一步的配置。
(3)在ISA Server服务器上,在“自动发现”选项卡中,设置使用自动发现的端口号。如果该ISA Server服务器没有发布Web服务器,并且本身也没有Web服务器,则可以使用“DNS发现功能”,这时,可以使用80端口。但现在的情况,一般ISA Server都会发布Web服务器,所以不能使用80端口,这时候可以指定其他端口(当前服务器没有使用的端口),例如,TCP的2501,如图8所示。
图7 设置DNS自动发现
在不使用80端口时,只能使用“DHCP”提供“ISA Server”的自动发现功能。
(4)切换到DHCP服务器上,右键单击DHCP服务器的名称,从弹出的快捷菜单中选择“设置预定义的选项”,单击“添加”按钮,在“选项类型”对话框中,在“名称”处键入大写的WPAD,“数据类型”选择“字符串”,“代码”选择252,在“描述”处键入
,然后单击“确定”按钮,如图8所示。
图8 添加WPAD选项
添加之后,右键单击“服务器选项”,在弹出的“服务器 选项”中,选中添加的“252的WPAD”选项,如图9所示。
图9 启用WPAD选项
【说明】还需要为每个VLAN创建作用域、设置作用域的地址范围、子网掩码、网关地址,并在“服务器选项”中,添加DNS地址为192.168.7.7,这些不一一介绍。
经过上述设置后,每台工作站设置“自动获得IP地址”与“DNS”地址,同时,ISA Server的“防火墙客户端”,就可以自