//目前此方法只在WindowsXP测试通过,在Windows2003服务器上不能应用
//本文主要介绍对用c#.net生成的Windows服务程序进行安装,共采用了两种方法,其中一种方法为调用
//installutil.exe进行安装,同时生成了 Process 类 的使用实例
//writer:furenjun 2006.4.28
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Runtime.InteropServices;
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
using System.Diagnostics;
using System.Reflection;
using System.Collections.Specialized;
using System.Text;
![](/Images/OutliningIndicators/None.gif)
namespace installWindowsService
![](/Images/OutliningIndicators/ExpandedBlockStart.gif) ![](/Images/OutliningIndicators/ContractedBlock.gif) {
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) /**//// <summary>
/// Form1 的摘要说明。
/// </summary>
public class Form1 : System.Windows.Forms.Form
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
![](/Images/OutliningIndicators/ContractedSubBlock.gif) Private Variables#region Private Variables
private string _servicePath;
private string _serviceName;
private System.Windows.Forms.OpenFileDialog openFileDialog1;
private System.Windows.Forms.Button button2;
private System.Windows.Forms.Button button3;
private System.Windows.Forms.RichTextBox richTextBox1;
private System.Windows.Forms.Button button4;
private string _serviceDisplayName;
#endregion Private Variables
![](/Images/OutliningIndicators/ContractedSubBlock.gif) DLLImport#region DLLImport
[DllImport("advapi32.dll")]
public static extern IntPtr OpenSCManager(string lpMachineName,string lpSCDB, int scParameter);
[DllImport("Advapi32.dll")]
public static extern IntPtr CreateService(IntPtr SC_HANDLE,string lpSvcName,string lpDisplayName,
int dwDesiredAccess,int dwServiceType,int dwStartType,int dwErrorControl,string lpPathName,
string lpLoadOrderGroup,int lpdwTagId,string lpDependencies,string lpServiceStartName,string lpPassword);
[DllImport("advapi32.dll")]
public static extern void CloseServiceHandle(IntPtr SCHANDLE);
[DllImport("advapi32.dll")]
public static extern int StartService(IntPtr SVHANDLE,int dwNumServiceArgs,string lpServiceArgVectors);
[DllImport("advapi32.dll",SetLastError=true)]
public static extern IntPtr OpenService(IntPtr SCHANDLE,string lpSvcName,int dwNumServiceArgs);
[DllImport("advapi32.dll")]
public static extern int DeleteService(IntPtr SVHANDLE);
[DllImport("kernel32.dll")]
public static extern int GetLastError();
#endregion
![](/Images/OutliningIndicators/InBlock.gif)
private System.Windows.Forms.Button button1;
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) /**//// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.Container components = null;
![](/Images/OutliningIndicators/InBlock.gif)
public Form1()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
//
// Windows 窗体设计器支持所必需的
//
InitializeComponent();
![](/Images/OutliningIndicators/InBlock.gif)
//
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
//
}
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) /**//// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose( bool disposing )
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
if( disposing )
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
if (components != null)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
components.Dispose();
}
}
base.Dispose( disposing );
}
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif) Windows 窗体设计器生成的代码#region Windows 窗体设计器生成的代码
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) /**//// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
this.button1 = new System.Windows.Forms.Button();
this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog();
this.button2 = new System.Windows.Forms.Button();
this.button3 = new System.Windows.Forms.Button();
this.richTextBox1 = new System.Windows.Forms.RichTextBox();
this.button4 = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// button1
//
this.button1.Location = new System.Drawing.Point(320, 24);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(248, 56);
this.button1.TabIndex = 0;
this.button1.Text = "第一种方法:安装Windows服务";
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// button2
//
this.button2.Location = new System.Drawing.Point(320, 88);
this.button2.Name = "button2";
this.button2.Size = new System.Drawing.Size(248, 56);
this.button2.TabIndex = 0;
this.button2.Text = "第二种方法:安装Windows服务";
this.button2.Click += new System.EventHandler(this.button2_Click);
//
// button3
//
this.button3.Location = new System.Drawing.Point(320, 160);
this.button3.Name = "button3";
this.button3.Size = new System.Drawing.Size(248, 56);
this.button3.TabIndex = 0;
this.button3.Text = "第二种方法:unInstallWindows服务";
this.button3.Click += new System.EventHandler(this.button3_Click);
//
// richTextBox1
//
this.richTextBox1.Location = new System.Drawing.Point(24, 32);
this.richTextBox1.Name = "richTextBox1";
this.richTextBox1.Size = new System.Drawing.Size(208, 232);
this.richTextBox1.TabIndex = 1;
this.richTextBox1.Text = "richTextBox1";
//
// button4
//
this.button4.Location = new System.Drawing.Point(328, 240);
this.button4.Name = "button4";
this.button4.Size = new System.Drawing.Size(176, 23);
this.button4.TabIndex = 2;
this.button4.Text = "执行进程";
this.button4.Click += new System.EventHandler(this.button4_Click);
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
this.ClientSize = new System.Drawing.Size(584, 310);
this.Controls.Add(this.button4);
this.Controls.Add(this.richTextBox1);
this.Controls.Add(this.button1);
this.Controls.Add(this.button2);
this.Controls.Add(this.button3);
this.Name = "Form1";
this.Text = "Form1";
this.ResumeLayout(false);
![](/Images/OutliningIndicators/InBlock.gif)
}
#endregion
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) /**//// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
Application.Run(new Form1());
}
![](/Images/OutliningIndicators/InBlock.gif)
private void button1_Click(object sender, System.EventArgs e)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
![](/Images/OutliningIndicators/InBlock.gif)
string svcPath;
string svcName;
string svcDispName;
//服务程序的路径
svcPath = @"E:\TransactionServiceCS\bin\Release\TransactionServiceCS.exe";
//OpenFileDialog openFileDialog1 = new OpenFileDialog();
![](/Images/OutliningIndicators/InBlock.gif)
openFileDialog1.InitialDirectory = "c:\\" ;
openFileDialog1.Filter = "exe file(*.exe)|*.*" ;
openFileDialog1.FilterIndex = 0 ;
openFileDialog1.RestoreDirectory = true ;
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
if(openFileDialog1.ShowDialog() != DialogResult.OK)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
return;
}
else
svcPath=this.openFileDialog1.FileName;
svcDispName="MyDBWriter";
svcName= "MyDBWriter";
if(InstallService(svcPath, svcName, svcDispName))
MessageBox.Show("安装成功") ;
Console.Read();
![](/Images/OutliningIndicators/InBlock.gif)
}
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) /**//// <summary>
/// 安装和运行
/// </summary>
/// <param name="svcPath">程序路径.</param>
/// <param name="svcName">服务名</param>
/// <param name="svcDispName">服务显示名称.</param>
/// <returns>服务安装是否成功.</returns>
public bool InstallService(string svcPath, string svcName, string svcDispName)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
![](/Images/OutliningIndicators/ContractedSubBlock.gif) Constants declaration.#region Constants declaration.
int SC_MANAGER_CREATE_SERVICE = 0x0002;
int SERVICE_WIN32_OWN_PROCESS = 0x00000010;
//int SERVICE_DEMAND_START = 0x00000003;
int SERVICE_ERROR_NORMAL = 0x00000001;
int STANDARD_RIGHTS_REQUIRED = 0xF0000;
int SERVICE_QUERY_CONFIG = 0x0001;
int SERVICE_CHANGE_CONFIG = 0x0002;
int SERVICE_QUERY_STATUS = 0x0004;
int SERVICE_ENUMERATE_DEPENDENTS = 0x0008;
int SERVICE_START =0x0010;
int SERVICE_STOP =0x0020;
int SERVICE_PAUSE_CONTINUE =0x0040;
int SERVICE_INTERROGATE =0x0080;
int SERVICE_USER_DEFINED_CONTROL =0x0100;
int SERVICE_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED |
SERVICE_QUERY_CONFIG |
SERVICE_CHANGE_CONFIG |
SERVICE_QUERY_STATUS |
SERVICE_ENUMERATE_DEPENDENTS |
SERVICE_START |
SERVICE_STOP |
SERVICE_PAUSE_CONTINUE |
SERVICE_INTERROGATE |
SERVICE_USER_DEFINED_CONTROL);
int SERVICE_AUTO_START = 0x00000002;
#endregion Constants declaration.
try
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
IntPtr sc_handle = OpenSCManager(null,null,SC_MANAGER_CREATE_SERVICE);
if (sc_handle.ToInt32() != 0)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
IntPtr sv_handle = CreateService(sc_handle,svcName,svcDispName,SERVICE_ALL_ACCESS,SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START,SERVICE_ERROR_NORMAL,svcPath,null,0,null,null,null);
if(sv_handle.ToInt32() ==0)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
CloseServiceHandle(sc_handle);
return false;
}
else
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
//试尝启动服务
int i = StartService(sv_handle,0,null);
if(i==0)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
![](/Images/OutliningIndicators/InBlock.gif)
return false;
}
![](/Images/OutliningIndicators/InBlock.gif)
CloseServiceHandle(sc_handle);
return true;
}
}
else
![](/Images/OutliningIndicators/InBlock.gif)
return false;
}
catch(Exception e)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
throw e;
}
}
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) /**//// <summary>
/// 反安装服务.
/// </summary>
/// <param name="svcName">服务名.</param>
public bool UnInstallService(string svcName)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
int GENERIC_WRITE = 0x40000000;
IntPtr sc_hndl = OpenSCManager(null,null,GENERIC_WRITE);
if(sc_hndl.ToInt32() !=0)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
int DELETE = 0x10000;
IntPtr svc_hndl = OpenService(sc_hndl,svcName,DELETE);
if(svc_hndl.ToInt32() !=0)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
int i = DeleteService(svc_hndl);
if (i != 0)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
CloseServiceHandle(sc_hndl);
return true;
}
else
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
CloseServiceHandle(sc_hndl);
return false;
}
}
else
return false;
}
else
return false;
}
![](/Images/OutliningIndicators/InBlock.gif)
private void button2_Click(object sender, System.EventArgs e)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
![](/Images/OutliningIndicators/InBlock.gif)
// Get the path to InstallUtil
string installUtilPath = RuntimeEnvironment.GetRuntimeDirectory() + "InstallUtil.exe";
string svsPath = @"E:\TransactionServiceCS\bin\Release\TransactionServiceCS.exe";
if(openFileDialog1.ShowDialog() != DialogResult.OK)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
return;
}
else
svsPath=@" "+this.openFileDialog1.FileName;
MessageBox.Show(svsPath) ;
this.button2.Enabled =false;
RunInstallUtil(installUtilPath,svsPath );
}
public void RunInstallUtil(string installUtilPath, string CmdParameterAndfullExeName)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
string argument = CmdParameterAndfullExeName;
![](/Images/OutliningIndicators/InBlock.gif)
// Create a new process
Process process = new Process();
![](/Images/OutliningIndicators/InBlock.gif)
// Setup the new process's information
ProcessStartInfo processStartInfo = new ProcessStartInfo();
// Set the path of the file to be executed by the new process
processStartInfo.FileName = installUtilPath;
// Set the arguments of the new process
processStartInfo.Arguments = argument;
// Stop it from using the shell to start the new process
//(this is necessary in order to stop it from creating a new window)
processStartInfo.UseShellExecute = false;
// Don't let it create a new window
//processStartInfo.CreateNoWindow = true;
processStartInfo.CreateNoWindow = false; //显示窗体
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
//注意 如果将 ErrorDialog 设置为 true,则 UseShellExecute 必须为 true。
//WorkingDirectory 属性的行为在 UseShellExecute 分别为 true 和 false 时是不同的。
//当 UseShellExecute 为 true 时,WorkingDirectory 属性指定可执行文件的位置。
//如果 WorkingDirectory 是空字符串,则认为当前目录包含可执行文件。
//当 UseShellExecute 为 false 时,不使用 WorkingDirectory 属性查找可执行文件。
//相反,它被已启动的进程使用,并且只在新进程的上下文中有意义。
// Assign the information to the process
process.StartInfo = processStartInfo;
![](/Images/OutliningIndicators/InBlock.gif)
// Start the process and wait for it to exit
process.Start();
![](/Images/OutliningIndicators/InBlock.gif)
process.WaitForExit();
button2.Enabled =true;
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
}
![](/Images/OutliningIndicators/InBlock.gif)
private void button3_Click(object sender, System.EventArgs e)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
string installUtilPath = RuntimeEnvironment.GetRuntimeDirectory() + "InstallUtil.exe";
string svsPath = @"E:\TransactionServiceCS\bin\Release\TransactionServiceCS.exe";
if(openFileDialog1.ShowDialog() != DialogResult.OK)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
return;
}
else
svsPath=@" /u "+this.openFileDialog1.FileName;
MessageBox.Show(svsPath) ;
this.button2.Enabled =false;
RunInstallUtil(installUtilPath,svsPath );
}
![](/Images/OutliningIndicators/InBlock.gif)
private void button4_Click(object sender, System.EventArgs e)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
// Start a new process for the cmd
//string FileName=@"..\..\printNum.exe";
this.richTextBox1.Text ="开始打印:"+System.DateTime.Now.ToString()+"\n";
string FileName=Application.StartupPath +@"\printNum.exe";
Process process = new Process();
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.CreateNoWindow = true;
process.StartInfo.FileName = FileName;
process.StartInfo.Arguments ="";
process.StartInfo.WorkingDirectory = Application.StartupPath ; //获取或设置要启动的进程的初始目录。
try
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
process.Start();
string outputStr=process.StandardOutput.ReadToEnd();
this.richTextBox1.AppendText(outputStr + Environment.NewLine);
}
catch(System.Exception e1)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
this.richTextBox1.AppendText(e1.ToString() + Environment.NewLine);
string ErrorOutput=process.StandardError.ToString();
this.richTextBox1.AppendText(ErrorOutput + Environment.NewLine);
if(process.HasExited)
process.Kill();
}
}
}
}
![](/Images/OutliningIndicators/None.gif)
using System;
using System.Threading;
namespace printNum
![](/Images/OutliningIndicators/ExpandedBlockStart.gif) ![](/Images/OutliningIndicators/ContractedBlock.gif) {
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) /**//// <summary>
/// Class1 的摘要说明。
/// </summary>
class Class1
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) /**//// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
//
// TODO: 在此处添加代码以启动应用程序
//
for (int lineNumber = 0; lineNumber < 50; lineNumber++)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
Console.WriteLine ("正在打印: " + lineNumber);
System.Threading.Thread.Sleep(2); // immitate doing something between Console Writes.
}
Console.WriteLine ("打印结束!");
}
}
}
![](/Images/OutliningIndicators/None.gif)
|