如何向Windows服务传递参数?

21

我尝试向Windows服务传递参数。

这是我的代码片段:

class Program : ServiceBase
{
    public String UserName { get; set; }
    public String Password { get; set; }

    static void Main(string[] args)
    {
        ServiceBase.Run(new Program());
    }

    public Program()
    {
        this.ServiceName = "Create Users Service";
    }

    protected override void OnStart(string[] args)
    {
        base.OnStart(args);

        String User = UserName;
        String Pass = Password;
        try
        {
            DirectoryEntry AD = new DirectoryEntry("WinNT://" + Environment.MachineName + ",computer");

            DirectoryEntry NewUser = AD.Children.Add(User, "user");
            NewUser.Invoke("SetPassword", new object[] { Pass });
            NewUser.Invoke("Put", new object[] { "Description", "Test User from .NET" });
            NewUser.CommitChanges();
            DirectoryEntry grp;
            grp = AD.Children.Find("Administrators", "group");
            if (grp != null)
            {
                grp.Invoke("Add", new object[] { NewUser.Path.ToString() });
            }
            Console.WriteLine("Account Created Successfully");
            Console.ReadLine();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
            Console.ReadLine();
        } 
    }

如何向此Windows服务传递用户名和密码?


如何将用户名和密码传递给这个Windows服务? - Ragaei Mahmoud
7个回答

33

您可以在启动时传递参数,如下所示:

  1. 右键单击我的电脑,选择"管理"->"服务和应用程序"->"服务"
  2. 右键单击您的服务,选择"属性",然后在"常规"选项卡下应该看到"启动参数"框。

如果您输入例如User Password,则在protected override void OnStart(string[] args)中将args作为这些参数获取。 然后像这样使用:

protected override void OnStart(string[] args)
{
    base.OnStart(args);
    UserName = args[0];
    Password = args[1];
    //do everything else
}

8
截至Win7(至少),这仅适用于从“属性”对话框中启动服务时设置要使用的参数。 - Martin Serrano
@MartinSerrano 你好。抱歉我不明白你的意思。 - Renatas M.
该对话框仅允许您为启动服务设置这些参数一次。要使其永久生效,您需要执行类似于此处第二个答案的操作:https://dev59.com/qnE95IYBdhLWcg3wlu-z - Martin Serrano

5

3
您可以使用配置文件、注册表或任何类型的数据库。

@Avada >>请问在哪里可以接受答案?我尝试过了,但是没有找到接受答案的复选框!!!从哪里可以找到呢?请告诉我。 - Ragaei Mahmoud

1
使用 Environment.GetCommandLineArgs()。

1
当启动Windows服务时,您可以传递参数。以管理员权限运行cmd并输入以下命令:
sc start <ServiceName> param1 param2

如果您想永久使用它一次,您可以将参数存储到文件或app.config中。


0
在运行时将参数传递给Windows服务的两种最干净的方法(不使用注册表、文件或数据库)是使用命名管道或在Windows中设置WCF服务,让客户端调用。默认情况下,Windows服务旨在成为一个重复运行的进程。
如果您使用WCF,请在添加/删除程序(或Windows 7的程序和功能)中打开它。
命名管道:

https://msdn.microsoft.com/en-us/library/aa365590(v=vs.85).aspx


0
我遇到了同样的问题,只不过我是在一个程序中安装服务。我正在使用sc.exe来安装服务,关键是要将应用程序路径和其命令行参数用双引号括起来传递给sc.exe:
从命令行中:
sc create myservice "myservice.exe -fappsettings.json"  

在代码中:
using (var process = new Process())
{
  process.StartInfo.FileName = "sc.exe";
  process.StartInfo.Arguments = $"create {serviceName} start= auto error= normal binpath= \"{Environment.ProcessPath} -fappsettings.ini\" displayname= {displayName}";
  process.StartInfo.Verb = "runas";
  process.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
  process.Start();
  process.WaitForExit();
}

对于OP来说,在服务的上下文中明文传递用户名和密码是一种安全风险。正如其他人提到的,将它们放在一个设置文件中,并使用上述方法来指定设置。请记住,服务控制管理器的当前工作目录将设置为c:\windows\services32或类似的目录。

A


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接