相关代码:-这是一个正在进行的工作,我仍处于发现阶段,因此并非所有异常路径都完整。不必担心重新抛出异常-我会解决的。
我也不得不说我对广告的经验很少。从来没有真正适合我。
大多数代码来自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方法有问题,但是我不知道是什么。我看不到以编程方式创建的用户和手动创建的用户之间的区别。
答案 0 :(得分:1)
正如我们的评论中所述,在测试之前,只需等待更长的时间才能将所做的更改复制到所有域控制器。
根据GetContext()
方法的编写方式,您甚至可能在创建帐户时遇到复制问题。如果它每次都创建一个新的PrincipalContext
对象,则理论上它可以第二次连接到另一个DC,此时该新帐户还不存在。 (尽管它会尝试将您与最近的人联系起来,所以可能始终是同一个人)
为避免任何获得不同DC的机会,您可以重用相同的PrincipalContext
对象,也可以读取PrincipalContext
的{{3}}属性,该属性将告诉您哪个DC最终被使用。然后,您可以在以后使用它来确保在同一DC上进行所有更改。
PrincipalContext
的构造函数将允许您将特定的DC作为域名传递给您:
var context = new PrincipalContext(ContextType.Domain, "dc1.domain.com");