7

我知道您可以通过以下方式使用给定的用户名/密码运行进程:

var processInfo = new ProcessStartInfo
{
    WorkingDirectory = workingDirectory,
    FileName = "a name",
    UserName = loggedUserName, 
    Password = "password",
    Domain = userNameDomain,
    UseShellExecute = false,
};
Process.Start(processInfo);

我面临的问题是我不想将实际密码写为代码的一部分,如果我将 Password 属性留空,则该过程将无法启动...如何在不暴露的情况下安全地启动该过程密码作为代码中的硬编码字符串?

4

2 回答 2

8

ProcessStartInfo.Password不是一个可以写下来并分配给属性的简单字符串。您需要的是一个SecureString实例,并且无法创建一个 SecureString,将一个简单的字符串传递给它的构造函数。显然,操作系统没有允许不受信任的程序检索当前用户密码的 API 或方法(这将是有史以来最大的安全漏洞)。

所以,在我看来,你只剩下一个选择。要求您的用户再次输入密码,结果输入应转换为 SecureString

这个例子是我在这里看到的字符串类的扩展方法

using System.Security;

// ...

public static SecureString ConvertToSecureString(this string password)
{
    if (password == null)
        throw new ArgumentNullException("password");

    unsafe
    {
        fixed (char* passwordChars = password)
        {
            var securePassword = new SecureString(passwordChars, password.Length);
            securePassword.MakeReadOnly();
            return securePassword;
        }
    }
}

您可以使用它来转换用户输入的密码并开始该过程

using(frmGetPassword fgp = new frmGetPassword())
{
     if(DialogResult.OK == fgp.ShowDialog())
     {
         SecureString ss = fgp.Password.ConvertToSecureString();
         var processInfo = new ProcessStartInfo
         {
             WorkingDirectory = workingDirectory,
             FileName = "a name",
             UserName = loggedUserName, 
             Password = ss,
             Domain = userNameDomain,
             UseShellExecute = false,
         };
         Process.Start(processInfo);
     }
}
于 2013-07-28T14:25:31.040 回答
2

我使用 windows 密码存储来管理此类密码。查看包含 Windows API的http://credentialmanagement.codeplex.com/库。您的 Setup-Routine 或 Admin 都可以将密码添加到存储中,然后可以在运行时从应用程序中检索该密码。唯一的缺点是商店是特定于用户的。您无法创建可跨多个用户使用的密码。

就这么简单:

        _credentials = new CredentialSet("myApp:*");
        if (_credentials.Count == 0)
        {
            //TODO: ask user for password, supply it here, or use windows UI to set password (rundll32.exe keymgr.dll, KRShowKeyMgr)
            var c = new Credential()
            {
                Target = "myApp:Production",
                Username = "SomeUser",
                Description = "Credentials for doing something...",
                PersistanceType = PersistanceType.LocalComputer,
                Type = CredentialType.DomainPassword
            };
            c.Save();
            _credentials.Add(c);
        }
于 2016-02-23T09:09:16.637 回答