C#部署数据库及IIS站点
程序员文章站
2023-12-19 11:50:34
一、前言
最近忙里偷闲,做了一个部署数据库及iis网站站点的wpf应用程序工具。
二、内容
此工具的目的是:
根据.sql文件在本机上部署数据库...
一、前言
最近忙里偷闲,做了一个部署数据库及iis网站站点的wpf应用程序工具。
二、内容
此工具的目的是:
- 根据.sql文件在本机上部署数据库
- 在本机部署iis站点,包括新建站点,新建应用程序池。只新建而不会对本机上原有的程序池或站点做修改操作
最终样式:(check按钮的作用是防止与本机已有的站点或程序池有冲突)
view:
<window x:class="autowebtool.mainwindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" xmlns:local="clr-namespace:autowebtool" title="web site automatic deployment" height="500" width="800" windowstartuplocation="centerscreen" resizemode="noresize"> <grid> <grid.rowdefinitions> <rowdefinition height="0.5*"/> <rowdefinition height="0.5*"/> <rowdefinition height="auto"/> </grid.rowdefinitions> <groupbox header="database configuration" fontsize="15" borderthickness="3" margin="5,10" grid.row="0"> <grid> <grid.rowdefinitions> <rowdefinition/> <rowdefinition/> <rowdefinition/> <rowdefinition/> </grid.rowdefinitions> <grid.columndefinitions> <columndefinition width="65*"/> <columndefinition width="133*"/> <columndefinition width="auto"/> </grid.columndefinitions> <textblock grid.row="0" grid.column="0" text="server address" horizontalalignment="center" verticalalignment="center" fontsize="15" height="26" /> <textblock grid.row="1" grid.column="0" text="user" horizontalalignment="center" verticalalignment="center" fontsize="15" height="26" /> <textblock grid.row="2" grid.column="0" text="password" horizontalalignment="center" verticalalignment="center" fontsize="15" height="26" /> <textblock grid.row="3" grid.column="0" text="script path" horizontalalignment="center" verticalalignment="center" fontsize="15" height="26" /> <textbox grid.row="0" grid.column="1" text="{binding serveraddress, mode=twoway, updatesourcetrigger=propertychanged}" horizontalalignment="left" verticalalignment="center" fontsize="15" width="450" height="32" /> <textbox grid.row="1" grid.column="1" text="{binding user, mode=twoway, updatesourcetrigger=propertychanged}" horizontalalignment="left" verticalalignment="center" fontsize="15" width="450" height="32" /> <passwordbox grid.row="2" grid.column="1" passwordchar="*" local:passwordboxhelper.password="{binding password, mode=twoway, updatesourcetrigger=propertychanged}" horizontalalignment="left" verticalalignment="center" fontsize="15" width="450" height="32"> <i:interaction.behaviors> <local:passwordboxbehavior /> </i:interaction.behaviors> </passwordbox> <textbox grid.row="3" grid.column="1" text="{binding sqlpath, mode=twoway, updatesourcetrigger=propertychanged}" horizontalalignment="left" verticalalignment="center" fontsize="15" width="450" height="32" /> <button grid.row="4" grid.column="2" width="70" height="25" margin="0,0,10,0" horizontalalignment="left" verticalalignment="center" content="browse" click="filepathbrowse_click"/> </grid> </groupbox> <groupbox header="website and pool" fontsize="15" borderthickness="3" margin="5,10" grid.row="1"> <grid> <grid.rowdefinitions> <rowdefinition/> <rowdefinition/> <rowdefinition/> <rowdefinition/> <rowdefinition/> </grid.rowdefinitions> <grid.columndefinitions> <columndefinition width="65*"/> <columndefinition width="133*"/> <columndefinition width="auto"/> </grid.columndefinitions> <textblock grid.row="0" grid.column="0" text="website name" horizontalalignment="center" verticalalignment="center" fontsize="15" height="26" /> <textblock grid.row="1" grid.column="0" text="website id" horizontalalignment="center" verticalalignment="center" fontsize="15" height="26" /> <textblock grid.row="2" grid.column="0" text="website physicalpath" horizontalalignment="center" verticalalignment="center" fontsize="15" height="26" /> <textblock grid.row="3" grid.column="0" text="website port" horizontalalignment="center" verticalalignment="center" fontsize="15" height="26" /> <textblock grid.row="4" grid.column="0" text="application pool name" horizontalalignment="center" verticalalignment="center" fontsize="15" height="26"/> <textbox grid.row="0" grid.column="1" text="{binding websitename, mode=twoway, updatesourcetrigger=propertychanged}" horizontalalignment="left" verticalalignment="center" fontsize="15" width="450" height="32" /> <textbox grid.row="1" grid.column="1" text="{binding websiteid, mode=twoway, updatesourcetrigger=propertychanged}" horizontalalignment="left" verticalalignment="center" fontsize="15" width="450" height="32" /> <textbox grid.row="2" grid.column="1" text="{binding physicalpath, mode=twoway, updatesourcetrigger=propertychanged}" horizontalalignment="left" verticalalignment="center" fontsize="15" width="450" height="32" /> <textbox grid.row="3" grid.column="1" text="{binding websiteport, mode=twoway, updatesourcetrigger=propertychanged}" horizontalalignment="left" verticalalignment="center" fontsize="15" width="450" height="32" /> <textbox grid.row="4" grid.column="1" text="{binding poolname, mode=twoway, updatesourcetrigger=propertychanged}" horizontalalignment="left" verticalalignment="center" fontsize="15" width="450" height="32" /> <button grid.row="0" grid.column="2" width="70" height="25" margin="0,0,10,0" horizontalalignment="left" verticalalignment="center" content="check" click="websitenamecheck_click"/> <button grid.row="1" grid.column="2" width="70" height="25" margin="0,0,10,0" horizontalalignment="left" verticalalignment="center" content="check" click="websiteidcheck_click"/> <button grid.row="2" grid.column="2" width="70" height="25" margin="0,0,10,0" horizontalalignment="left" verticalalignment="center" content="browse" click="pathbrowse_click"/> <button grid.row="3" grid.column="2" width="70" height="25" margin="0,0,10,0" horizontalalignment="left" verticalalignment="center" content="check" click="websiteportcheck_click"/> <button grid.row="4" grid.column="2" width="70" height="25" margin="0,0,10,0" horizontalalignment="left" verticalalignment="center" content="check" click="poolnamecheck_click"/> </grid> </groupbox> <stackpanel grid.row="2" orientation="horizontal" horizontalalignment="right" verticalalignment="center" margin="10"> <button width="70" height="25" content="ok" click="deploy_click"/> <button width="70" height="25" content="cancel" margin="10,0,0,0" click="close_click"/> </stackpanel> </grid> </window>
view的后台文件:
using system.windows; using system.windows.controls; using system.windows.interactivity; namespace autowebtool { /// <summary> /// mainwindow.xaml 的交互逻辑 /// </summary> public partial class mainwindow : window { private autogenerationvm _vm; public mainwindow() { initializecomponent(); datacontext = new autogenerationvm(); _vm = datacontext as autogenerationvm; } private bool sqlpath; private void filepathbrowse_click(object sender, routedeventargs e) { sqlpath = _vm.getsqlfilepath(); } private void websitenamecheck_click(object sender, routedeventargs e) { var isinuse = _vm.checknameandid(); if (isinuse) { messagebox.show("1.this name is empty \r\n2.this name is in use,please change name!"); } else { messagebox.show("no problem!"); } } private void websiteidcheck_click(object sender, routedeventargs e) { var isinuse = _vm.checknameandid(); if (isinuse) { messagebox.show("1.this id is empty \r\n2.this id is in use,please change id!"); } else { messagebox.show("no problem!"); } } private bool physicalpath; private void pathbrowse_click(object sender, routedeventargs e) { physicalpath = _vm.getfolderpath(); } private void websiteportcheck_click(object sender, routedeventargs e) { var isinuse = _vm.checkwebport(); if (isinuse) { messagebox.show("1.this port is empty \r\n2.this port is in use,please change port!"); } else { messagebox.show("no problem!"); } } private void poolnamecheck_click(object sender, routedeventargs e) { var isinuse = _vm.ckeckpoolname(); if (isinuse) { messagebox.show("1.this pool name is empty \r\n2.this name is in use,please change name!"); } else { messagebox.show("no problem!"); } } private void deploy_click(object sender, routedeventargs e) { var databaseserveraddresschecked = string.isnullorempty(_vm.serveraddress); var databaseuserchecked = string.isnullorempty(_vm.user); var databasepasswordchecked = string.isnullorempty(_vm.password); var databasescriptchecked = sqlpath; var databasecondition = !databaseserveraddresschecked && !databaseuserchecked && !databasepasswordchecked && !databasescriptchecked; var websitenameandidchecked = _vm.checknameandid(); var websiteportchecked = _vm.checkwebport(); var applicationpoolnamechecked = _vm.ckeckpoolname(); var websitecondition = !websitenameandidchecked && !physicalpath && !websiteportchecked && !applicationpoolnamechecked; if (databasecondition&& websitecondition) { _vm.execute(); } else { messagebox.show("please check your input!"); } } private void close_click(object sender, routedeventargs e) { close(); } } public static class passwordboxhelper { public static readonly dependencyproperty passwordproperty = dependencyproperty.registerattached("password", typeof(string), typeof(passwordboxhelper), new frameworkpropertymetadata(string.empty, onpasswordpropertychanged)); private static void onpasswordpropertychanged(dependencyobject sender, dependencypropertychangedeventargs e) { var passwordbox = sender as passwordbox; string password = (string)e.newvalue; if (passwordbox != null && passwordbox.password != password) { passwordbox.password = password; } } public static string getpassword(dependencyobject dp) { return (string)dp.getvalue(passwordproperty); } public static void setpassword(dependencyobject dp, string value) { dp.setvalue(passwordproperty, value); } } public class passwordboxbehavior : behavior<passwordbox> { protected override void onattached() { base.onattached(); associatedobject.passwordchanged += onpasswordchanged; } private static void onpasswordchanged(object sender, routedeventargs e) { var passwordbox = sender as passwordbox; string password = passwordboxhelper.getpassword(passwordbox); if (passwordbox != null && passwordbox.password != password) { passwordboxhelper.setpassword(passwordbox, passwordbox.password); } } protected override void ondetaching() { base.ondetaching(); associatedobject.passwordchanged -= onpasswordchanged; } } }
viewmodel:
using system; using system.directoryservices; using system.componentmodel; using system.linq; using system.net; using system.net.networkinformation; using microsoft.web.administration; using system.windows.forms; using system.diagnostics; using system.data.sqlclient; using system.io; namespace autowebtool { public class autogenerationvm : inotifypropertychanged { public autogenerationvm() { _physicalpath = appdomain.currentdomain.basedirectory; } //database serveraddress private string _serveraddress = string.empty; public string serveraddress { get { return _serveraddress; } set { if (_serveraddress != value) { _serveraddress = value; notifypropertychanged("serveraddress"); } } } //database user private string _user = string.empty; public string user { get { return _user; } set { if (_user != value) { _user = value; notifypropertychanged("user"); } } } //database password private string _password = string.empty; public string password { get { return _password; } set { if (_password != value) { _password = value; notifypropertychanged("password"); } } } //database sqlpath private string _sqlpath = string.empty; public string sqlpath { get { return _sqlpath; } set { if (_sqlpath != value) { _sqlpath = value; notifypropertychanged("sqlpath"); } } } public bool getsqlfilepath() { var openfiledialog = new openfiledialog(); openfiledialog.filter = "数据库脚本文件|*.sql"; if (openfiledialog.showdialog() == dialogresult.ok) { sqlpath = openfiledialog.filename; } return false; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //website name private string _websitename = string.empty; public string websitename { get { return _websitename; } set { if (_websitename != value) { _websitename = value; notifypropertychanged("websitename"); } } } //website id private string _websiteid = string.empty; public string websiteid { get { return _websiteid; } set { if (_websiteid != value) { _websiteid = value; notifypropertychanged("websiteid"); } } } /// <summary> /// check website name and id /// </summary> /// <returns></returns> public bool checknameandid() { if (string.isnullorempty(websitename) || string.isnullorempty(websiteid)) return true; directoryentry rootentry = new directoryentry("iis://localhost/w3svc"); foreach (directoryentry entry in rootentry.children) { if (entry.schemaclassname.equals("iiswebserver", stringcomparison.ordinalignorecase)) { if (websiteid == entry.name) { return true; } if (entry.properties["servercomment"].value.tostring() == websitename) { return true; } } } return false; } //physical path private string _physicalpath = string.empty; public string physicalpath { get { return _physicalpath; } set { if (_physicalpath != value) { _physicalpath = value; notifypropertychanged("physicalpath"); } } } /// <summary> /// get path for website /// </summary> public bool getfolderpath() { if (string.isnullorempty(physicalpath)) return true; var openfolderdialog = new folderbrowserdialog(); if (openfolderdialog.showdialog() == dialogresult.ok) { physicalpath = openfolderdialog.selectedpath; } return false; } //website port private string _websiteport = string.empty; public string websiteport { get { return _websiteport; } set { if (_websiteport != value) { _websiteport = value; notifypropertychanged("websiteport"); } } } /// <summary> /// check website port /// </summary> /// <returns></returns> public bool checkwebport() { try { ipglobalproperties ipproperties = ipglobalproperties.getipglobalproperties(); ipendpoint[] ipendpoints = ipproperties.getactivetcplisteners(); foreach (ipendpoint endpoint in ipendpoints) { if (endpoint.port == convert.toint32(websiteport)) { return true; } } return false; } catch { return true; } } //pool name private string _poolname = string.empty; public string poolname { get { return _poolname; } set { if (_poolname != value) { _poolname = value; notifypropertychanged("poolname"); } } } /// <summary> /// check application pool name /// </summary> /// <returns></returns> public bool ckeckpoolname() { if (string.isnullorempty(poolname)) return true; var manager = new servermanager(); var list = manager.applicationpools; var matcheditem = list.firstordefault(x => x.name == poolname); if (matcheditem != null) return true; return false; } /// <summary> /// execute script /// </summary> public void execute() { //deploy database var tmpconn = new sqlconnection(); tmpconn.connectionstring = "server = " + serveraddress +"; database = master; user id = " + user+ "; pwd = " + password+ ";"; var scriptfile = new fileinfo(sqlpath); var sqlcreatedbquery = scriptfile.opentext().readtoend(); sqlcommand mycommand = new sqlcommand(sqlcreatedbquery, tmpconn); try { tmpconn.open(); mycommand.executenonquery(); messagebox.show("database has been created successfully!","create database", messageboxbuttons.ok,messageboxicon.information); } catch (exception ex) { messagebox.show(ex.tostring(), "create database", messageboxbuttons.ok, messageboxicon.information); return; } finally { tmpconn.close(); } try { //deploy website and application pool var script = "net start w3svc " + "& cd c:/windows/system32/inetsrv " + "& appcmd add site /name:" + websitename + " /id:" + websiteid + " /physicalpath:" + physicalpath + " /bindings:http/*:" + websiteport + ":" + websitename + " & appcmd add apppool /name:" + poolname + " /managedruntimeversion:v4.0 /managedpipelinemode:integrated" + " & appcmd set site /site.name:" + websitename + " /[path='/'].applicationpool:" + poolname; processstartinfo startinfo = new processstartinfo(); startinfo.workingdirectory = @"c:\windows\system32"; startinfo.filename = @"c:\windows\system32\cmd.exe"; startinfo.redirectstandardinput = true; startinfo.redirectstandardoutput = true; startinfo.redirectstandarderror = true; startinfo.useshellexecute = false; startinfo.verb = "runas"; process process = new process(); process.startinfo = startinfo; process.start(); process.standardinput.writeline(script); process.standardinput.writeline("&exit"); process.standardinput.flush(); process.standardinput.close(); process.waitforexit(); messagebox.show("iis website and application pool deployed successfully!", "create website and application pool", messageboxbuttons.ok, messageboxicon.information); } catch (exception ex) { messagebox.show(ex.tostring(), "exception", messageboxbuttons.ok, messageboxicon.information); } } public event propertychangedeventhandler propertychanged; private void notifypropertychanged(string name) { propertychanged?.invoke(this, new propertychangedeventargs(name)); } } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。