2012-02-29 17 views
0

チェックイン/チェックアウトリスト項目のコードを記述しました。これは管理者にはうってつけですが、その他の権限レベルには問題があります。サイトの "_vti_bin/lists.asmx"にあるUpdateListItemsの401の不正なエラーです。ユーザーが "_vti_bin/lists.asmx" Webサービスを表示できることを確認しました。SPServiceを使用してUpdateListItemsが正しく実行されないようにするアクセス許可

 //declare variables used for check-in/check-out. 
    var varName; 
    var varChecked; 
    var varID 
    var varQueryStringVals; 
    //Check who has checked out the item 
    function getCheckOutPerson(){ 
$().SPServices({ 
    operation: "GetListItems", 
    async: false, 
    listName: "Communications Services Request Form", 
    CAMLQuery: "<Query><Where><Eq><FieldRef Name='ID' /><Value Type='Number'>" + varID + "</Value></Eq></Where></Query>", 
    completefunc: function (xData, Status) { 
     $(xData.responseXML).SPFilterNode("z:row").each(function() { 
     varChecked = $(this).attr("ows_CheckedOutTo"); 
     }); 
    } 
    }); 
    }; 

$(document).ready(function() { 
//Check-in if edits cancelled 
    $("#cancelBtn").click(function(){ 
     //Check in edited item. 
     if (varName == varChecked){ 
    $().SPServices({ 
     operation: "UpdateListItems", 
     async: false, 
     debug: true, 
     listName: "Communications Services Request Form", 
     ID: varID, 
     valuepairs: [["CheckedOutTo", ""]], 
     completefunc: function(xData, Status) {} 
    }); 
    }; 
    }); 
//get current user 
    varName = $().SPServices.SPGetCurrentUser({ 
    fieldName: "Title", 
    debug: false 
}); 
//get current list item ID 
varQueryStringVals = $().SPServices.SPGetQueryString(); 
varID = varQueryStringVals["ID"]; 
    //get checked out name 
    getCheckOutPerson(); 
    // item checked in or checked out by current user? 
    if (varChecked == undefined || varName == varChecked){ 
//check out item 
    $().SPServices({ 
     operation: "UpdateListItems", 
     async: false, 
     debug: true, 
     listName: "Communications Services Request Form", 
     ID: varID, 
     valuepairs: [["CheckedOutTo", varName]], 
     completefunc: function(xData, Status) { 
     } 
    }); 
}; 
//checked out message 
if (varChecked != undefined && varName != varChecked) { 
alert ("You cannot edit this item. It is check out by " + varChecked +"."); 
history.back(); 
}; 
//Display 'checked out to' in dispitem.aspx 
getCheckOutPerson(); 
    if ($('.CheckedOut').text('')) { 
    $('.CheckedOut').append(varChecked); 
    } 
    }); 

function PreSaveAction() { 
if (varName != varChecked){ 
alert ("You cannot make changes to this item. It it checked out to " + varChecked); 
return false; 
}; 
     //Check in edited item. 
    $().SPServices({ 
     operation: "UpdateListItems", 
     async: false, 
     debug: true, 
     listName: "Communications Services Request Form", 
     ID: varID, 
     valuepairs: [["CheckedOutTo", ""]], 
     completefunc: function(xData, Status) {} 
    }); 
    return true; 
}; 

答えて

0

管理者以外のユーザーには十分な権限がありますか?チェックアウト/チェックインの場合、読み取り専用では十分ではありません。

アイテムレベルの権限を使用していますか? http://www.novolocus.com/2009/05/08/updatelistitems-web-service-fails-when-using-item-level-permissions/

lists.asmx UndoCheckOutを使用して実例を得ることができました。テストは、管理者/所有者と寄与しているユーザーと合格しました。 docUrlはアイテムの完全なURLである必要があります(例:http://server/site/list/item.txt)。 SOAPActionはヘッダーにあります(Jan Tielen-http://weblogs.asp.net/jan/archive/2009/05/25/quot-the-security-validation-for-this-page-is-invalid-quot-when-calling-the-sharepoint-web-services.aspxを参照してください)。

function UndoCheckout(docUrl){ 
    var soapEnv = 
     "<?xml version='1.0' encoding='utf-8'?> \ 
      <soap:Envelope xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'> \ 
       <soap:Body> \ 
        <UndoCheckOut xmlns='http://schemas.microsoft.com/sharepoint/soap/'> \ 
         <pageUrl>"+ docUrl +"</pageUrl> \ 
        </UndoCheckOut> \ 
       </soap:Body> \ 
      </soap:Envelope>"; 
$.ajax({ 
    url: "http://server/mysite/_vti_bin/lists.asmx", 
     type: "POST", 
     dataType: "xml", 
     data: soapEnv, 
     contentType: "text/xml; charset=\"utf-8\"", 
     beforeSend: function(xhr) { 
      xhr.setRequestHeader("SOAPAction", 
      "http://schemas.microsoft.com/sharepoint/soap/UndoCheckOut"); 
     }, 
     complete: function(xData, status){ 
      var result = $(xData.responseXML).find("UndoCheckOutResult").text(); 
      if (result == "true") alert("Undo checkout succeeded."); 
     }, 
     error: function(){ 
      alert("error"); 
     } 
    }); 
} 
+0

ユーザーは投稿のアクセス許可を持っていますが、フルアクセスを試みても、401の不正なエラーが発生します。 – Calen

+0

また、UpdateListItemsコールでIDを使用しています。コントリビュータレベルのアカウントが正しいIDを取得しています。 – Calen

+0

ええ、それは、ユーザーがリモートAPIを使用する権限を持っていないように、アクセス許可がうんざりしていたことが判明しました。それが問題を引き起こしていたのです。 – Calen

0

これは私がそこに投稿したものとは関係ありません。アクセス許可の階層が乱れているため、上位レベルのサイトのユーザーに対して、リストレベルでアクセス許可を与えるようにし、リストレベルのアクセス許可が無視されると、ユーザーに読み取りアクセス許可が与えられます。