SharePoint开发错误—此用户不存在或不唯一

今天做了一个用户管理的WebPart,系统帐户测试OK,发现普通的用户访问那个页面时提示“拒绝访问”,于是将其中的一部分代码拎出来做测试,建了一个WebPartTest项目,向里面添加了两个控件,一个Button,一个ListBox,Button用来触发,ListBox用来显示值,页面主要代码如下:

1 <asp:UpdatePanel ID="UpdatePanel" runat="server">
2 <ContentTemplate>
3 <asp:Button ID="btnTest" Text="Test" OnClick="btnTest_Click" runat="server" />
4 <asp:ListBox ID="lGroups" Height="200" Width="400" runat="server"></asp:ListBox>
5 </ContentTemplate>
6 </asp:UpdatePanel>

其中btnTest_Click事件如下:

1 protected void btnTest_Click(object sender, EventArgs e)
2 {
3 VisualWebPart1 p = new VisualWebPart1();
4 lGroups.DataSource = p.GetAllGroupsByCurUser();
5 lGroups.DataBind();
6 }

GetAllGroupsByCurUser()方法用于获取当前网站集中所有者为当前用户或包含当前用户的用户组,其代码如下:

View Code
 1 public List<SPGroup> GetAllGroupsByCurUser()
2 {
3 List<SPGroup> allGroups = new List<SPGroup>();
4 SPSecurity.RunWithElevatedPrivileges(delegate
5 {
6 using (SPSite mySite = SPContext.Current.Site)
7 //using (SPSite mySite = new SPSite(SPContext.Current.Site.ID))
8 {
9 using (SPWeb myWeb = mySite.RootWeb)
10 {
11 SPUser u = myWeb.CurrentUser;
12 SPGroupCollection groups = myWeb.SiteGroups;
13 foreach (SPGroup g in groups)
14 {
15 //判断一下当前用户是否为用户组所有者里面的对象
16 int a = CheckGroupOrUser(g.Owner);
17 switch (a)
18 {
19 case 1:
20 SPGroup gg = myWeb.SiteGroups[g.Owner.ToString()];
21
22 if (DoesGroupContainUser(gg, u))
23 {
24 allGroups.Add(g);
25 }
26 break;
27 case 0:
28 if (u.LoginName == g.Owner.ToString())
29 {
30 allGroups.Add(g);
31 }
32 break;
33 }
34 }
35 }
36 }
37 });
38 return allGroups;
39 }
40
41 private int CheckGroupOrUser(SPMember m)
42 {
43 int r = 1;
44 try
45 {
46 SPUser u = (SPUser)m;
47 r = 0;
48 }
49 catch (Exception e)
50 {
51
52 }
53 return r;
54 }
55
56 private bool DoesGroupContainUser(SPGroup g, SPUser u)
57 {
58 bool r = false;
59 foreach (SPUser uu in g.Users)
60 {
61 if (uu.LoginName == u.LoginName)
62 {
63 r = true;
64 }
65 }
66 return r;
67 }

现在将其部署,然后测试了一下,发现系统帐户能成功运行,但是普通用户(网站集中有一个用户组属于它)运行后什么也不发生,由于普通用户是不能进行单步调试的,所以我就查看了一下SharePoint的Logs日志,发现当中有一个错误是“此用户不存在或不唯一”。后来多次修改后发现将SPSite mySite = new SPSite(siteUrl)后居然成功了,原来是用SPContext.Current.Site找不到当前的网站集,需要在这里进行实例化,于是将其改为SPSite mySite = new SPSite(SPContext.Current.Site.ID),然后测试,成功。

posted @ 2011-08-10 17:38  Statmoon  阅读(1190)  评论(0编辑  收藏  举报