Sharepoint 2007 使用SPServices阻止UpdateListItems正常运行的权限

Sharepoint 2007 使用SPServices阻止UpdateListItems正常运行的权限,sharepoint-2007,Sharepoint 2007,我已经编写了签入/签出列表项的代码。它可以很好地与管理员配合使用,但任何其他权限级别都会遇到问题,即该站点的“\u vti\u bin/lists.asmx”上的UpdateListItems出现401未经授权的错误。我已经确认用户可以查看“\u vti\u bin/lists.asmx”web服务 //declare variables used for check-in/check-out. var varName; var varChecked; var varID

我已经编写了签入/签出列表项的代码。它可以很好地与管理员配合使用,但任何其他权限级别都会遇到问题,即该站点的“\u vti\u bin/lists.asmx”上的UpdateListItems出现401未经授权的错误。我已经确认用户可以查看“\u vti\u bin/lists.asmx”web服务

     //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;
 };
//声明用于签入/签出的变量。
var varName;
var varChecked;
变量
var varQueryStringVals;
//检查谁已签出该项目
函数getCheckOutPerson(){
$().SPServices({
操作:“GetListItems”,
async:false,
列表名称:“通信服务请求表”,
CAMLQuery:“+varID+”,
completefunc:函数(扩展数据、状态){
$(扩展数据.responseXML).SPFilterNode(“z:row”).each(函数(){
varChecked=$(this.attr(“ows_CheckedOutTo”);
});
}
});
};
$(文档).ready(函数(){
//如果编辑被取消,请签入
$(“#取消BTN”)。单击(函数(){
//签入已编辑的项目。
if(varName==varChecked){
$().SPServices({
操作:“UpdateListItems”,
async:false,
是的,
列表名称:“通信服务请求表”,
ID:varID,
valuepairs:[[“CheckedOutTo”,“”]],
completefunc:函数(扩展数据,状态){}
});
};
});
//获取当前用户
varName=$().SPServices.SPGetCurrentUser({
字段名:“标题”,
调试:false
});
//获取当前列表项ID
varQueryStringVals=$().SPServices.SPGetQueryString();
varID=varQueryStringVals[“ID”];
//签出名称
getCheckOutPerson();
//项目是否由当前用户签入或签出?
if(varChecked==未定义| | varName==varChecked){
//签出项目
$().SPServices({
操作:“UpdateListItems”,
async:false,
是的,
列表名称:“通信服务请求表”,
ID:varID,
valuepairs:[[“CheckedOutTo”,varName]],
completefunc:函数(扩展数据、状态){
}
});
};
//签出消息
if(varChecked!=未定义&&varName!=varChecked){
警报(“您无法编辑此项目。它由“+varChecked+”签出”);
历史。返回();
}; 
//在dispitem.aspx中显示“签出到”
getCheckOutPerson();
如果($('.CheckedOut')。文本(''){
$('.CheckedOut').append(varChecked);
}
});
函数PreSaveAction(){
if(varName!=varChecked){
警报(“您无法对此项进行更改。它已签出为“+varChecked”);
返回false;
};
//签入已编辑的项目。
$().SPServices({
操作:“UpdateListItems”,
async:false,
是的,
列表名称:“通信服务请求表”,
ID:varID,
valuepairs:[[“CheckedOutTo”,“”]],
completefunc:函数(扩展数据,状态){}
});
返回true;
};

非管理员用户是否有足够的权限?对于签出/签入,只读是不够的

您是否正在使用项目级权限?

我能够使用lists.asmx UndoCheckOut获得一个工作示例。测试通过了一个具有admin/owner的用户和另一个仅具有contribution的用户。docUrl必须是项目的完整url(例如-)。注意,标题中的SOAPAction(参见Jan Tielen-)

函数撤消签出(docUrl){
var soapEnv=
" \
\
\
\
“+docUrl+”\
\
\
";
$.ajax({
url:“http://server/mysite/_vti_bin/lists.asmx",
类型:“POST”,
数据类型:“xml”,
数据:soapEnv,
contentType:“text/xml;字符集=\“utf-8\”,
发送前:函数(xhr){
setRequestHeader(“SOAPAction”,
"http://schemas.microsoft.com/sharepoint/soap/UndoCheckOut");
},
完成:功能(扩展数据、状态){
var result=$(xData.responseXML.find(“UndoCheckOutResult”).text();
如果(结果==“true”)警报(“撤消签出成功”);
},
错误:函数(){
警报(“错误”);
}
});
}

结果表明,这与我在那里发布的任何内容无关。权限层次结构混乱,因此当我尝试在列表级别为用户提供贡献权限时,会向用户提供更高站点的读取权限,而忽略列表级别的权限。

用户有贡献权限,但我也尝试了完全访问权限,但仍会出现401未经授权的错误。此外,我在UpdateListItems调用中使用了ID,参与者级别的帐户获得了正确的ID。是的,结果是权限混乱,用户没有使用远程API的权限。这就是造成问题的原因。
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");
        }
    });
}