C#-以用户身份使用空密码运行新进程

C#-以用户身份使用空密码运行新进程,c#,impersonation,system.diagnostics,processstartinfo,C#,Impersonation,System.diagnostics,Processstartinfo,我有一个子进程是从我的主应用程序生成的,它需要作为另一个本地用户在Windows7机器上运行。我不希望在该用户帐户上设置密码,但似乎使用模拟创建新进程不允许使用空密码或任何类型的空值。有人知道这是否可能吗 下面是我传递空白字符的尝试: ProcessStartInfo info = new ProcessStartInfo(@"C:\PathToExecutable"); System.Security.SecureString psswd = new System.Security.Secur

我有一个子进程是从我的主应用程序生成的,它需要作为另一个本地用户在Windows7机器上运行。我不希望在该用户帐户上设置密码,但似乎使用模拟创建新进程不允许使用空密码或任何类型的空值。有人知道这是否可能吗

下面是我传递空白字符的尝试:

ProcessStartInfo info = new ProcessStartInfo(@"C:\PathToExecutable");
System.Security.SecureString psswd = new System.Security.SecureString();
psswd.AppendChar('\0');
psswd.MakeReadOnly();

info.UseShellExecute = false;
info.UserName = "NewProcessName";
info.Password = psswd;
info.Domain = "LocalMachine";

Process newProc = new Process();
newProc.StartInfo = info;

newProc.Start();
编辑: 我收到的错误消息


登录失败:用户帐户限制。可能的原因是不允许使用空白密码、登录时间限制或已强制执行策略限制

您使用什么来模拟
LogonUser()
应允许空白密码

我不认为调用
psswd.AppendChar('\0')
是指定空白密码的正确方法。尝试从代码中删除
SecureString
,以查看是否至少可以使模拟正常工作。然后重新添加SecureString以查看问题是否存在

*编辑*

试试这个:

unsafe {
    char* ary = stackalloc char[0];
    SecureString str = new SecureString(ary, 0);
}

info.Password
设置为新的SecureString。。。不确定是否必须在
不安全的
上下文中执行此操作。

正如问题所指出的,在
StartInfo
中将
LoadUserProfile
设置为true。试试看,可能会有帮助。

这显然是一个已知的问题,
LogonUser()
在密码为空时失败。我在我的用例中为所需的用户帐户设置了一个通用密码。

为此,必须禁用安全策略

  • 转到控制面板→ 管理工具→ 当地安全政策
  • 浏览安全设置→ 地方政策→ 安全选项。。。查找“帐户:限制本地帐户使用空密码,仅用于控制台登录”
  • 选择禁用并应用
  • 这里还有其他解决方案:


    然后你就可以在不声明用户密码的情况下执行一个进程了

    是的,在另一篇文章中,我运行的可执行文件也是我自己的,它不依赖于用户配置文件。谢谢。如果我选择不指定任何密码(省略
    StartInfo.password
    ),我将收到相同的消息。如果我进入控制面板,修改用户帐户并添加密码(使用字符“a”进行测试),我可以通过SecureString将“a”作为密码传递,这很好。只是不想设置密码……您是否尝试过调用重载的Start(),它接受用户名、密码和域,并在那里传递一个空白密码?我希望得到同样的结果,但千方百计……问题是StartInfo.Password是一个
    System.Security.SecureString
    ,因此即使重载的
    Start()
    也需要
    System.Security.SecureString
    ,而不仅仅是一个不能为空的字符串。我很接近于只设置虚拟密码,然后继续,这个帐户不需要保护,它的唯一目的就是模拟,所以“123”密码就可以了。我只是很惊讶,你可以有一个没有密码的用户帐户,但不能在这里发送一个空白密码。我给了你上一次编辑一个镜头,得到了相同的错误。目前,我假设您需要指定密码。这很糟糕:(抱歉,我无法给出答案!很可能是因为默认的空白密码使用安全限制:。如果您检查错误代码,它应该表示“由于安全策略而拒绝登录”。
    ProcessStartInfo procStartInfo = new ProcessStartInfo("File Name", "Argument(Optional)")
    {
          UserName = "UserName",
          RedirectStandardError = true,
          RedirectStandardOutput = true,
          UseShellExecute = false,
          CreateNoWindow = true
    };
    using (Process proc = new Process())
    {
           proc.StartInfo = procStartInfo;
           proc.Start();
    }