zoukankan      html  css  js  c++  java
  • C#基础-代码部署数据库及IIS站点

    一、前言

           最近忙里偷闲,做了一个部署数据库及IIS网站站点的WPF应用程序工具。

    二、内容

           此工具的目的是:

    1. 根据.sql文件在本机上部署数据库
    2. 在本机部署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 
    2.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 
    2.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 
    2.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 
    2.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:WindowsSystem32";
                    startInfo.FileName = @"C:WindowsSystem32cmd.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));
            }
        }
    }
  • 相关阅读:
    JAVA——return浅析
    JAVA泛型【转】
    C#——WinForm修改密码
    java获取当前时间的方式【转】
    iOS 取得单张系统图片
    iOS UIView的简单渐变效果
    UIView 添加子视图的常用方法
    IOS之UIView的tag学习
    OC学习笔记之属性详解和易错点
    oc对象函数什么时候返回值类型使用instancetype
  • 原文地址:https://www.cnblogs.com/lovecsharp094/p/8618139.html
Copyright © 2011-2022 走看看