使用System.DirectoryServices.AccountManagement创建的用户无法访问Sharepoint网站

时间:2019-03-07 17:53:00

标签: c# sharepoint active-directory

相关代码:-这是一个正在进行的工作,我仍处于发现阶段,因此并非所有异常路径都完整。不必担心重新抛出异常-我会解决的。

我也不得不说我对广告的经验很少。从来没有真正适合我。

大多数代码来自Microsoft示例。

public static bool AddUser(string firstName, string lastName, string userLogonName,
    string employeeID, string emailAddress, string telephone, string address,
    string Password, DateTime expiry)
{
    PrincipalContext principalContext = GetContext();

    // Check if user object already exists in the store
    if (UserExists(userLogonName))
    {
        throw new Exception(userLogonName + " already exists. Please use a different User Logon Name.");
    }

    // Create the new UserPrincipal object
    UserPrincipal userPrincipal = new UserPrincipal(principalContext);

    if (lastName != null && lastName.Length > 0)
    {
        userPrincipal.Surname = lastName;
    }

    if (firstName != null && firstName.Length > 0)
    {
        userPrincipal.GivenName = firstName;
    }

    if (employeeID != null && employeeID.Length > 0)
    {
        userPrincipal.EmployeeId = employeeID;
    }

    if (emailAddress != null && emailAddress.Length > 0)
    {
        userPrincipal.EmailAddress = emailAddress;
    }

    if (telephone != null && telephone.Length > 0)
    {
        userPrincipal.VoiceTelephoneNumber = telephone;
    }

    if (userLogonName != null && userLogonName.Length > 0)
    {
        userPrincipal.SamAccountName = userLogonName;
    }

    userPrincipal.AccountExpirationDate = expiry;


    userPrincipal.SetPassword(Password);

    userPrincipal.Enabled = true;
    userPrincipal.PasswordNeverExpires = true;

    try
    {
        userPrincipal.Save();
    }
    catch (Exception e)
    {
        throw new Exception("Exception saving user object. ", e);
    }
    return true;
}

AND

public static void AddUserToGroup(string userLogonName, string groupName)
{
    try
    {
        using (PrincipalContext principalContext = GetContext())
        {
            GroupPrincipal group = GroupPrincipal.FindByIdentity(principalContext, groupName);
            group.Members.Add(FindUser(userLogonName));
            group.Save();
        }
    }
    catch (System.DirectoryServices.DirectoryServicesCOMException e)
    {
        throw e;
    }
}

运行测试(添加用户)并检查Active Directory时,该用户在那里。到目前为止,一切都很好。

然后我运行添加到组测试,用户在AD中显示为MemberOf组。同样,一切都如预期。

现在,我导航到Sharepoint网站,然后尝试以新创建的用户身份登录。我收到“对不起,此网站尚未与您共享。”

...插曲:在组和权限周围进行大量拨弄都无济于事...

接下来,我在AD中手动创建了一个用户,然后运行“添加到组”测试。在AD中一切看起来都不错,我可以成功登录到Sharepoint网站。

所以,我怀疑AddUser方法有问题,但是我不知道是什么。我看不到以编程方式创建的用户和手动创建的用户之间的区别。

1 个答案:

答案 0 :(得分:1)

正如我们的评论中所述,在测试之前,只需等待更长的时间才能将所做的更改复制到所有域控制器。

根据GetContext()方法的编写方式,您甚至可能在创建帐户时遇到复制问题。如果它每次都创建一个新的PrincipalContext对象,则理论上它可以第二次连接到另一个DC,此时该新帐户还不存在。 (尽管它会尝试将您与最近的人联系起来,所以可能始终是同一个人)

为避免任何获得不同DC的机会,您可以重用相同的PrincipalContext对象,也可以读取PrincipalContext的{​​{3}}属性,该属性将告诉您哪个DC最终被使用。然后,您可以在以后使用它来确保在同一DC上进行所有更改。

PrincipalContext的构造函数将允许您将特定的DC作为域名传递给您:

var context = new PrincipalContext(ContextType.Domain, "dc1.domain.com");