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

时间:2010-08-30 21:14:24

标签: c# impersonation system.diagnostics processstartinfo

我有一个从我的主应用程序生成的子进程,需要在Windows 7计算机上作为另一个本地用户运行。我宁愿不在该用户帐户上设置密码,但似乎创建一个具有模拟的新进程不允许空密码或任何类型的空值。有人知道这是否可行?

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

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();

编辑: 我收到的错误消息

Logon failure: user account restriction. Possible reasons are blank passwords not allowed, logon hour restrictions, or a policy restriction has been enforced

4 个答案:

答案 0 :(得分:1)

你在冒什么? LogonUser()应该允许空白密码。

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

*编辑*

试试这个:

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

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

答案 1 :(得分:0)

this问题指出时,请在LoadUserProfile中将StartInfo设置为true。尝试一下,它可能有所帮助。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

为此,您必须禁用安全策略

  1. 转到控制面板→管理工具→本地安全策略。
  2. 浏览安全设置→本地策略→安全选项...,查找“帐户:将本地帐户的空白密码限制为仅控制台登录”。
  3. 选择“禁用并申请”

这里还有其他解决方案: https://sites.google.com/site/sqlestream/windows-issue/10-cannot-access-the-shared-folder-due-to-blank-password-not-allowed

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();
}

然后您就可以执行一个过程而无需声明用户密码