以编程方式创建Windows用户c#.net(使用PricinpalUser/CreateProfile)

本文关键字:使用 PricinpalUser CreateProfile net 方式 编程 创建 Windows 用户 | 更新日期: 2023-09-27 18:21:37

简而言之,我要做的是创建一个能够登录的新用户

我从各种来源提取了代码,并试图简化它。然而,我遇到了一些绊脚石。

当我调用UserPrincipal.Save()时,它会给我一个错误

具有的"在缓存中找不到目录属性"异常类型为..'COMException越过了本机/托管边界"。

出于某种原因,当我直接运行程序时(不是通过vs2010),它运行得很好。所以我可以避开它!

不过,我的主要问题是,尽管一切看起来都很好,但当我尝试登录时,它会显示"加载桌面"或其他信息,然后只说"注销"。所以就好像配置文件没有正确设置一样。

API"CreateProfile"的返回值不是0,因此这可能会导致问题。

我还有什么需要做的吗?

我的代码是…

private void Run(string un, string pw)
{
    UserPrincipal NewUP = CreateUser(un, pw);
    AddGroup(NewUP, "Users");
    AddGroup(NewUP, "HomeUsers");
    CreateProfile(NewUP);
}
private UserPrincipal CreateUser(string Username, string Password)
{
    PrincipalContext pc = new PrincipalContext(ContextType.Machine, Environment.MachineName);
    UserPrincipal up = UserPrincipal.FindByIdentity(pc, IdentityType.SamAccountName, Username);
    if (up == null)
    {
        up = new UserPrincipal(pc, Username, Password, true);
        up.UserCannotChangePassword = false;
        up.PasswordNeverExpires = false;
        up.Save(); // this is where it crashes when I run through the debugger
    }
    return up;
}
private void AddGroup(UserPrincipal Up, string GroupName)
{
    PrincipalContext pc = new PrincipalContext(ContextType.Machine, Environment.MachineName);
    GroupPrincipal gp = GroupPrincipal.FindByIdentity(pc, GroupName);
    if (!gp.Members.Contains(Up))
    {
        gp.Members.Add(Up);
        gp.Save();
    }
    gp.Dispose();
}
private void CreateProfile(UserPrincipal Up)
{
    int MaxPath = 240;
    StringBuilder pathBuf = new StringBuilder(MaxPath);
    uint pathLen = (uint)pathBuf.Capacity;
    int Res = CreateProfile(Up.Sid.ToString(), Up.SamAccountName, pathBuf, pathLen);
}

以编程方式创建Windows用户c#.net(使用PricinpalUser/CreateProfile)

奇怪的是,当它在服务器机器(即不是我的开发机器)上运行时,它工作得很好。我有一种感觉,这是与Windows7,或我的特定安装有关。

无论如何,谢谢你的建议。