【问题标题】:Run Multiple Commands/Set Server Password运行多个命令/设置服务器密码
【发布时间】:2018-12-08 16:09:33
【问题描述】:

抱歉没有说清楚。这是解释。

有一个命令“admin setserver systempw”用于设置密码。在 cmd 中键入该命令后单击“Enter”,它将提示用户输入。我们必须输入一个字符串并按“Enter”,这将把该字符串设置为命令中提到的服务器的密码。现在我必须使用 c# 代码自动执行该执行。屏幕应该有 2 个输入文本框和一个按钮。输入是服务器名称和密码。单击该按钮时,它应该执行顶部提到的命令,将输入的服务器名称和密码关联为命令的输入。 使用教程,我可以创建一个运行第一个命令的进程。但是,我无法关联密码。我怎样才能将该密码与我提到的命令相关联。


C:/> admin setserver systempw '点击 Enter'
请输入密码:Sai@45678 '点击进入'

密码设置成功。

这是我正在尝试编写的一段代码。

            string servername = TextBox1.Text;

            ProcessStartInfo procStartInfo = new ProcessStartInfo("cmd", "/c admin setserver systempw  " + servername );
            procStartInfo.RedirectStandardOutput = true;
            procStartInfo.UseShellExecute = false;

            procStartInfo.CreateNoWindow = true;

            procStartInfo.WorkingDirectory = @"C:/";

            Process proc = new Process();
            proc.StartInfo = procStartInfo;
            proc.Start();

            string result = proc.StandardOutput.ReadToEnd();

            MessageBox.Show("Done! " + result);

如何将第二个文本框值(密码)作为参数关联到进程。如何将密码链接到提示“请输入密码:”。

请解释一下。

【问题讨论】:

  • 如果你能提供一个minimal reproducible example 你迄今为止的尝试,那就太棒了。
  • 1) 不太清楚你在问什么... 2) 告诉我们你做了什么以及为什么它不起作用
  • 由于您的问题不清楚,您是否正在寻找命令行参数?命令行参数允许您在运行应用程序时灵活地接收任何参数,然后在代码中管理数据。如果您正在寻找这种情况,您可以尝试以下解决方案。您可以根据需要将其扩展得很远。 docs.microsoft.com/en-us/dotnet/csharp/programming-guide/…

标签: c# command-line-arguments


【解决方案1】:

在彻底更新您的帖子后,我相信您可能会在这里做以下两件事之一:

  • 如何根据用户输入执行不同的命令?
  • 如何在服务器上更改用户密码。

我将对每一项进行基本概述,希望您能接受更好的教育,并希望更新您的帖子以反映您真正想要的结果。

神奇的开关

要在控制台应用程序中执行多个命令,请查看 C# 中可用的 switch structure。这将允许您根据某些标准(例如用户输入)执行不同的代码位。例如:

using System;
using static System.Console;

private static bool exit = false;
private static string serverName = string.Empty;
static void Main(string[] args) {
        WriteLine("Please enter a command.");
        string response = ReadLine();

        switch (response) {
            case "setserver": SetServer(); break;
            case "changepass": ChangePassword(); break;
        }
    }
    ReadKey();
}
static void SetServer() {
    WriteLine("Please enter a server name.");
    serverName = ReadLine(); // You should probably validate the user input here.
}
static void ChangePassword() {
    // Execute your needed password change code here.
}

这将使您开始在控制台应用程序中执行多个命令。

更改密码(Active Directory)

对于 Active Directory 更改,您应该查看 this postthis documentation 了解更多信息。它使用的代码(以防链接因某种原因失效)是:

// Connect to Active Directory and get the DirectoryEntry object.
// Note, ADPath is an Active Directory path pointing to a user. You would have created this
// path by calling a GetUser() function, which searches AD for the specified user
// and returns its DirectoryEntry object or path. See http://www.primaryobjects.com/CMS/Article61.aspx
DirectoryEntry oDE;
oDE = new DirectoryEntry(ADPath, ADUser, ADPassword, AuthenticationTypes.Secure);

try {
   // Change the password.
   oDE.Invoke("ChangePassword", new object[]{strOldPassword, strNewPassword});
} 
catch (Exception e) {
   Debug.WriteLine($"Error changing password. Reason: {e.Message}");
}

更改密码(SQL Server)

对于 SQL Server 更改,我建议您查看 this post(解决此问题有两个不错的答案)和 this documentationSqlConnection 对象级别更改密码。

SqlConnection.ChangePassword(string, string);

将连接字符串中指定的用户的 SQL Server 密码更改为提供的新密码。

提供给其他帖子的答案将结合此代码:

string sqlquery = "SELECT Password FROM [Member] where Username=@username";
SqlCommand cmd = new SqlCommand(sqlquery, connect);
cmd.Parameters.AddWithValue("@username", label_username.Text);
cmd.Connection = connect; 
string currentPassword = (string)cmd.ExecuteScalar();

if (currentPassword == textBox_Current.Text) {
    // PASSWORD IS CORRECT, CHANGE IT, NOW.
} else {
    // WOW EASY BUDDY, NOT SO FAST
}

有了这个建议:

  • 考虑你的字符串用户名 -> 散列它 -> 写一个查询来检查这个散列值和存储在数据库中的用户密码的散列值是否相同
  • 考虑字符串密码和字符串newPassword -> 检查每个是否为空或长度为0
  • 在你的代码中考虑字符串密码和字符串newPassword -> 哈希两者 -> 检查哈希值是否相同

重要提示

无论您要解决什么问题,在处理密码时,您都应该认真考虑密码附带的散列和加密。如果您要更改服务器上的密码,您还应该在更改之前验证旧密码。您还应该通过检查非法字符来验证新密码,确保密码强度足够,验证新密码的初始输入是否与确认输入匹配,以及其他一些事情,例如可能围绕密码的散列和加密您需要进行验证。

详尽的发布

如果您需要更全面的答案来解决更具体的问题,例如在您有权访问的服务器上实际更改密码,请更新您的问题并通过遵循 mjwills 的建议并访问Minimal, Complete, and Verifiable example 来更彻底地回答。这将使其他读者不仅可以更好地为您提供帮助,还可以帮助未来的读者解决类似的问题。一旦您更新了您的问题以反映真正想要的结果,我将更新我的答案(如果我有答案)以展示您正在寻求的知识。

【讨论】:

    【解决方案2】:

    经过深思熟虑,我想你是在问“DOS 风格的程序如何获得用户输入?”

    这里有两种方法,一种来自提示,另一种来自弹出窗口。

    Sub Main()
        Dim whut As String
    
        Console.WriteLine("I demand input!:")
        whut = Console.ReadLine() 'from dos prompt
    
        whut = InputBox("Say whut?") 'from popup window
    
        Console.WriteLine(whut)
    End Sub
    

    希望根据我们对您想要什么的猜测,您可以拼凑出一些东西。

    【讨论】:

      猜你喜欢
      • 2017-10-29
      • 1970-01-01
      • 2023-04-07
      • 2021-08-29
      • 1970-01-01
      • 1970-01-01
      • 2022-11-08
      • 1970-01-01
      • 2019-04-13
      相关资源
      最近更新 更多