看到網上不少人遇到過這種類似的錯誤,而產生這種錯誤的原因也有多種,我產生此錯誤的背景是在試圖通過ECMAscript物件模型把一個User添加到某個指定的Group中時遇到的。
問題1.當我試圖把一個User添加到Sharepoint的某個指定的Group,而這個User已經在Site Collection中存在,在此背景下我得到此錯誤資訊。
問題2.如果我試圖把一個在Site Collection中不存在,而在AD中存在的User添加到Sharepoint的某個指定Group中時,這種操作是肯定不能成功的。因為微軟的MSDN中明確指出了只能添加已經在Site Collection中存在的AD Users。
我的解決步驟如下:
一、檢查關於使用者佈建資訊的代碼是否有問題。
我原來的代碼如下:
function addUserToSharePointGroup(groupID) {
//var clientContext = new SP.ClientContext(siteUrl);
var clientContext = new SP.ClientContext.get_current();
var collGroup = clientContext.get_web().get_siteGroups();
var oGroup = collGroup.getById(groupID);
var userCreationInfo = new SP.UserCreationInformation();
userCreationInfo.set_email('help@star.com.cn');
userCreationInfo.set_loginName('help');
userCreationInfo.set_title('help');
this.oUser = oGroup.get_users().add(userCreationInfo); //add user into group
var userInfo = '\nUser: ' + oUser.get_title() +
'\nEmail: ' + oUser.get_email() +
'\nLogin Name: ' + oUser.get_loginName();
alert(userInfo);
clientContext.load(oUser);
clientContext.executeQueryAsync(Function.createDelegate(this, this.onQuerySucceededaddUserToSharePointGroup),
Function.createDelegate(this, this.onQueryFailedaddUserToSharePointGroup));
}
function onQuerySucceededaddUserToSharePointGroup() {
alert(this.oUser.get_title() + " added.");
}
function onQueryFailedaddUserToSharePointGroup(sender, args) {
alert('Request failed. ' + args.get_message() + '\n' + args.get_stackTrace());
}
此代碼存在問題主要在userCreateInfo代碼:
1、set_loginName設定項應該加入此使用者所在的域 DOMAIN
2、DOMAIN後面應該用"\\",否則在實際產生的User時就會把DOMAIN與User直接連接起來(如:DOMAINuser),這樣的使用者當然在AD中是不存在的
因此,在代碼設定中,針對User的Information應該符合真正存在的那個User在AD Account中的設定情況,所以在上述代碼中你可以看到我加入了一個alert來顯示設定的資訊,便於你在查錯時與AD中此user的對應資訊進行比較。
針對上面的問題修改後的代碼如下:
function addUserToSharePointGroup(groupID) {
//var clientContext = new SP.ClientContext(siteUrl);
var clientContext = new SP.ClientContext.get_current();
var collGroup = clientContext.get_web().get_siteGroups();
var oGroup = collGroup.getById(groupID);
var userCreationInfo = new SP.UserCreationInformation();
userCreationInfo.set_email('help@star.com.cn');
userCreationInfo.set_loginName('STAR\\help');
userCreationInfo.set_title('help');
this.oUser = oGroup.get_users().add(userCreationInfo); //add user into group
var userInfo = '\nUser: ' + oUser.get_title() +
'\nEmail: ' + oUser.get_email() +
'\nLogin Name: ' + oUser.get_loginName();
alert(userInfo);
clientContext.load(oUser);
clientContext.executeQueryAsync(Function.createDelegate(this, this.onQuerySucceededaddUserToSharePointGroup),
Function.createDelegate(this, this.onQueryFailedaddUserToSharePointGroup));
}
function onQuerySucceededaddUserToSharePointGroup() {
alert(this.oUser.get_title() + " added.");
}
function onQueryFailedaddUserToSharePointGroup(sender, args) {
alert('Request failed. ' + args.get_message() + '\n' + args.get_stackTrace());
}
二、檢查Windows Server的 Domain member: Digitally encrypt or sign secure channel data (always) 安全設定項。
如果上面的排錯沒有解決The user does not exist or is not unique報錯,那麼就進入這一步進行償試。
由於我的開發環境是Server 2008 R2,認證方式採用的是Kerberos(據說這點很重要,因為如果採用的是windows NTLM方式,則不會存在Application與AD環境的資訊溝通問題),據說Windows Server 2008 (或 R2)中有某個Feature不支援Sharepoint上啟動並執行Application,由此可能會造成AD資訊交換出問題。
解決的辦法就是設定Domain member: Digitally encrypt or sign secure channel data (always) 這個安全項。這個選項預設是開啟的,我們需要手工停止它。方法是在伺服器上 Start -> Run -> type gpedit.msc.
進行設定介面後,依序開啟
Computer Configuration -> Windows Settings -> Security Settings -> Local Policies -> Security Options.在Security Options的右邊你可以看到此選項,請手工將其停止,然後重啟伺服器。
需要指明的是,此處我只列出了上述兩種解決思路,如果上面的情況均未解決你遇到的問題,你就需要針對你自己的特定情況,捕獲可能的相關錯誤資訊來解決問題。