MOSS模拟管理员权限
今天做个小实验时,遇到个小问题。当用户在listA下添加一个item时,要对另外一个listB里的数据进行更新,而该用户对于listB只有读取权限,怎么办呢
于是翻书看看了,才发现原来MOSS有中模拟管理员权限的方法〔SPSecurity.RunWithElevatedPrivileges(delegate())},这样一来问题就解决了
1
public override void ItemAdded(SPItemEventProperties properties)
2
{
3
SPWeb web = properties.OpenWeb();
4
SPListItem item = properties.ListItem;
5
6
7
8
9
10
string name = item["Name"].ToString();
11
int num = int.Parse(item["People"].ToString());
12
13
14
SPSecurity.RunWithElevatedPrivileges(delegate()
15
{
16
try
17
{
18
using (SPSite mySite = new SPSite("http://cpu"))
19
{
20
SPWeb webs = mySite.RootWeb;
21
SPList list = webs.Lists["Second"];
22
23
24
25
foreach (SPListItem newitem in list.GetItems(list.DefaultView))
26
{
27
if (newitem["Name"].ToString().Trim() == name)
28
{
29
newitem["People"] = int.Parse(newitem["People"].ToString()) - num;
30
}
31
32
newitem.Update();
33
}
34
}
35
}
36
catch(Exception ex)
37
{
38
using (StreamWriter sw = new StreamWriter(@"c:\test.txt", true))
39
{
40
sw.WriteLine(ex.ToString());
41
}
42
43
}
44
}
45
);
46
47
48
}

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

SPSecurity.RunWithElevatedPrivileges(delegate() { // implementation details omitted });
可以提升代码的运行权限,实现模拟管理员身份的功能。
在RunWithElevatedPrivileges中不要使用SPContext.Current.Web,SPContext.Current.Site,SPControl.GetContextWeb(HttpContext.Current)之类的根据当前上下文得到当前的Web或者Site,根据这些方法得到的所有对象(包括从根据这些对象得到的List,ListItem等等对象)都是以当前网站登录用户权限运作的,即使是在RunWithElevatedPrivileges其运作权限也不会是管理员。
所以,如果要真正让在RunWithElevatedPrivileges中的代码以管理员权限正常运作的话,必须重新初始化相应的对象,比如:
SPSecurity.RunWithElevatedPrivileges(delegate() { using (SPSite mySite = new SPSite(SPContext.Current.Site.Url)) { Response.Write(mySite.RootWeb.CurrentUser.LoginName); } });
以上mySite.RootWeb.CurrentUser.LoginName返回的是管理员的登录帐号。
但是如果按之前所说使用SPContext:
SPSecurity.RunWithElevatedPrivileges(delegate()
{
Response.Write(SPContext.Current.Web.CurrentUser.LoginName);
});
这时候即使在提升权限的范围内运行,得到的也是当前网站登录帐户名,而不是管理员登录帐号
































【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!