ProjectServer如何让系统管理员模拟普通用户创建自己的时间表
public bool ProcessTimesheet(Guid siteGuid, Guid tsGuid, string lcid, string userName, bool submitStatus, string sspName)
{
#region Local Variables
string exceptionMsg = null;
string tsInfo = string.Empty;
Stopwatch timeToProcessAll = new Stopwatch();
Stopwatch timeToProcessStatus = new Stopwatch();
timeToProcessAll.Start();
//SPSite spSite = new SPSite("http://win-9dubqmslff7/pwa/");
bool result = false;
#endregion try
{
if (appLog == null) appLog = new AppLog(LoggingPrefix, LoggingFolder, LogFileEveryHour); #region STEP 1 - Initialize Web Service urls statusing.Url = "http://win-9dubqmslff7/PWA/_vti_bin/psi/statusing.asmx";//WSUrl( HostName, sspName, "statusing", true);
resource.Url = WSUrl(HostName, sspName, "resource", false);
timesheet.Url = WSUrl(HostName, sspName, "timesheet", false); if (logEvents)
appLog.WriteLine(string.Format("STEP 1 - Initialize Web Service urls")); #endregion #region STEP 2 - Retrieve Timesheet DataSet TimesheetWS.TimesheetDataSet timesheetDS = timesheet.ReadTimesheet(tsGuid);
TimesheetPSI tsHeader = new TimesheetPSI(timesheetDS);
Guid tspUID = tsHeader.PeriodUID;
Guid tresUID = tsHeader.ResUID; if (logEvents)
{
appLog.WriteLine(string.Format("STEP 2 - Start event override for timesheet UID: {0}", tsGuid.ToString()));
tsInfo = string.Format("Timesheet: {0}; Resource: {1}; Creator: {2}, Period: {3}",
tsHeader.Name, tsHeader.ResName, tsHeader.CreatorResName, tspUID.ToString());
}
#endregion ResourceWS.ResourceDataSet resourceDS = resource.ReadResource(tresUID);
ResourcePSI resourcePSI = new ResourcePSI(resourceDS); bool isWindowsUser = userName.StartsWith("AspNetSqlMembershipProvider") ? false : true;
statusing.SetImpersonationContext(isWindowsUser, userName, tresUID, Guid.Empty, siteGuid, lcid);
timesheet.SetImpersonationContext(isWindowsUser, userName, tresUID, Guid.Empty, siteGuid, lcid); if (logEvents) appLog.WriteLine(string.Format("STEP 3 - Statusing Impersonation for RES_UID: {0}", tresUID.ToString())); #endregion TimesheetWS.TimesheetDataSet timeSheetDs = new TimesheetWS.TimesheetDataSet();
TimesheetWS.TimesheetDataSet.HeadersRow headersRow = timeSheetDs.Headers.NewHeadersRow();
headersRow.RES_UID = new Guid("97B3EBBF-871B-4ED6-B366-5EFE59B68F4A");
headersRow.TS_UID = Guid.NewGuid();
headersRow.WPRD_UID = new Guid("EE8C2B3E-556B-4FAC-9CE1-537A51B4CCF6");
headersRow.TS_CREATOR_RES_UID = new Guid("97B3EBBF-871B-4ED6-B366-5EFE59B68F4A");
headersRow.TS_NAME = "我的时间表";
headersRow.TS_COMMENTS = "Create By PSI";
headersRow.TS_ENTRY_MODE_ENUM = (byte)PSLibrary.TimesheetEnum.EntryMode.Weekly;
timeSheetDs.Headers.AddHeadersRow(headersRow); timesheet.CreateTimesheet(timeSheetDs, TimesheetWS.PreloadType.Default); } using System;
using System.Collections.Generic;
using System.Net;
using System.Text; // Project Server 2007 References
using Microsoft.Office.Project.Server.Library; namespace Microsoft.EPM.TSAutoStatus
{
/// <summary>
/// Timesheet Helper Methods
/// </summary>
class TimesheetPSI
{
#region Properties private string name;
private string resName;
private string creatorResName;
private Guid creatorResUID;
private Guid resUID;
private Guid periodUID;
private decimal totalActValue;
/// <summary>
/// Timesheet Name
/// </summary>
public string Name
{
get { return name; }
}
/// <summary>
/// Resource Name
/// </summary>
public string ResName
{
get { return resName; }
}
/// <summary>
/// Timesheet creator resource name
/// </summary>
public string CreatorResName
{
get { return creatorResName; }
}
/// <summary>
/// Timesheet creator resource UID
/// </summary>
public Guid CreatorResUID
{
get { return creatorResUID; }
}
/// <summary>
/// Resource UID
/// </summary>
public Guid ResUID
{
get { return resUID; }
}
/// <summary>
/// Period UID
/// </summary>
public Guid PeriodUID
{
get { return periodUID; }
}
/// <summary>
/// Total actual value in hours
/// </summary>
public decimal TotalActValue
{
get { return totalActValue; }
}
#endregion #region Constructor /// <summary>
/// Timesheet header information
/// </summary>
/// <param name="timesheetDS">Timesheet DataSet</param>
public TimesheetPSI(TimesheetWS.TimesheetDataSet timesheetDS)
{
name = timesheetDS.Headers[0].TS_NAME;
resName = timesheetDS.Headers[0].TS_CACHED_RES_NAME;
creatorResName = timesheetDS.Headers[0].TS_CACHED_CREATOR_RES_NAME;
creatorResUID = timesheetDS.Headers[0].TS_CREATOR_RES_UID != Guid.Empty ? timesheetDS.Headers[0].TS_CREATOR_RES_UID : Guid.NewGuid();
resUID = timesheetDS.Headers[0].RES_UID != Guid.Empty ? timesheetDS.Headers[0].RES_UID : Guid.NewGuid();
periodUID = timesheetDS.Headers[0].WPRD_UID != Guid.Empty ? timesheetDS.Headers[0].WPRD_UID : Guid.NewGuid();
totalActValue = timesheetDS.Headers[0].TS_TOTAL_ACT_VALUE/60000;
} #endregion
} /// <summary>
/// Perform WS impersonation
/// </summary>
class TimesheetDerived : TimesheetWS.TimeSheet
{
private String contextString = String.Empty; protected override WebRequest GetWebRequest(Uri uri)
{
WebRequest webRequest = base.GetWebRequest(uri);
if (contextString != String.Empty)
{
webRequest.UseDefaultCredentials = true;
webRequest.Credentials = CredentialCache.DefaultCredentials;
webRequest.Headers.Add("PjAuth", contextString);
webRequest.Headers.Add("ForwardFrom", "/_vti_bin/psi/timesheet.asmx");
webRequest.PreAuthenticate = true;
}
return webRequest;
} public void SetImpersonationContext(bool isWindowsUser, String userNTAccount, Guid userGuid, Guid trackingGuid, Guid siteId, String lcid)
{
contextString = GetImpersonationContext(isWindowsUser, userNTAccount, userGuid, trackingGuid, siteId, lcid);
} private String GetImpersonationContext(bool isWindowsUser, String userNTAccount, Guid userGuid, Guid trackingGuid, Guid siteId, String lcid)
{
PSContextInfo contextInfo = new PSContextInfo(isWindowsUser, userNTAccount, userGuid, trackingGuid, siteId, lcid);
return PSContextInfo.SerializeToString(contextInfo);
}
}
}
调用的时候:
UpdateStatus update = new UpdateStatus("http://win-9dubqmslff7/pwa");
Guid siteGuid = new Guid("4E925E19-93AC-4275-9FD6-336D7E874377");
Guid tsGuid = new Guid("C06F9A45-F19F-404A-A1D6-DF3ACDBA05BE");
string lcid = "1033";
string userName = @"HN\xxxx";
bool submitStatus = true;
string sspName = "pwa";
update.ProcessTimesheet( siteGuid, tsGuid, lcid, userName, submitStatus, sspName);
这里详细介绍下参数:
siteGuid就是我们网站集的GUID,一般指PWA的网站集
tsGuid就是我们的时间表的GUID,这里我们创建时间表的时候无需用到,如果是读取时间表的数据,在[ProjectServer_Published].[dbo].[MSP_TIMESHEETS]下的TS_UID字段
lcid指中英文版本,中文1033
userName指被模拟的账户,如果我想模拟X账户,只需填写X的用户名即可
headersRow.RES_UID = new Guid("97B3EBBF-871B-4ED6-B366-5EFE59B68F4A");指的是被模拟账户的RESOURCE GUID
headersRow.TS_CREATOR_RES_UID = new Guid("97B3EBBF-871B-4ED6-B366-5EFE59B68F4A");指的是创建时间表用户的RESOURCE GUID,一般指本人
headersRow.WPRD_UID = new Guid("EE8C2B3E-556B-4FAC-9CE1-537A51B4CCF6");指的是时间表的日期GUID,从[ProjectServer_Reporting].[dbo].[MSP_TimesheetPeriod]表里面查找,找到指定日期的GUID即可。
同理,根据模拟账户还可以做很多事情,比如有些用户保存了时间表的工时,但是忘记提交,系统可以自动模拟用户将未提交的工时提交上去。

ProjectServer如何让系统管理员模拟普通用户创建自己的时间表的更多相关文章
- 使用 Web API 模拟其他用户
模拟的要求 模拟可代表另一个 Microsoft Dynamics CRM 用户,用于执行业务逻辑(代码)以便提供所需功能或服务,它使用模拟用户的相应角色和基于对象的安全性.这项技术很有必要,因为 M ...
- linux 用户创建、管理、权限分配
(1)su与sudo su:通过su可以在用户之间切换,如果超级权限用户root向普通或虚拟用户切换不需要密码,什么是权力?这就是!而普通用户切换到其它任何用户都需要密码验证: sudo: sudo扮 ...
- oracle用户创建及权限设置及表空间
建立表空间: create tablespace portx_data datafile 'D:\oracle_data\portx.dbf' size 50m autoextend on next ...
- oracle用户创建及权限设置
权限: create session create table unlimited tablespace connect resource dba 例: #sqlplus /nolog SQL> ...
- [转载]Oracle用户创建及权限设置
出处:https://www.cnblogs.com/buxingzhelyd/p/7865194.html 权限: create session 允许用户登录数据库权限 create table ...
- 写了一个Windows服务,通过C#模拟网站用户登录并爬取BUG列表查询有没有新的BUG,并提醒我
写了一个Windows服务,通过C#模拟网站用户登录并爬取BUG列表查询有没有新的BUG,并提醒我 1.HttpUtil工具类,用于模拟用户登录以及爬取网页: using System; using ...
- 转载:oracle用户创建及权限设置
权限: create session create table unlimited tablespace connect resource dba 例: #sqlplus /nolog SQL> ...
- oracle用户创建及权限设置(转)
权限: create session create table unlimited tablespace connect resource dba 例: #sqlplus /nolog SQL> ...
- MYSQL添加新用户 MYSQL为用户创建数据库 MYSQL为新用户分配权限
1.新建用户 //登录MYSQL @>mysql -u root -p @>密码 //创建用户 mysql> insert into mysql.user(Host,User,Pas ...
随机推荐
- textarea的实现
由于限制字数是用原有的 maxlength会有问题,所以用一般会用js控制,今天用到三种: (一)html: <body> <form name=myform action=&quo ...
- WAMP环境配置-Mysql安装
1.下载并解压MySQL5.6.36压缩包(顺便重命名一下子). 2.将my-default.ini文件复制一份改名为my.ini,然后修改下面红框标注的地方 3.安装与启动服务. 以管理员的身份运行 ...
- Android界面编程--使用活动条(ActionBar)--通过ActionBar菜单改变TextView的字体和颜色
android:orientation="vertical"(AndroidStudio不提示,这个要记住了) 昨天好不容易把ActionBar从溢出菜单overflow中弄出来了 ...
- html元素固定
1.position 值 描述 static 默认.位置设置为 static 的元素,它始终会处于页面流给予的位置(static 元素会忽略任何 top.bottom.left 或 ri ...
- 2.C#编程语言
C#(sharp):是一种编程语言,可以开发基于.net平台的应用. java即是一种平台,也是一名语言. 在.net平台当中,C#是主流语言.C#语言开发的应用不能脱离.net环境而独立运行 ...
- 二、MVC3+EF单表增删改查
document 表为例 写入静态类 NorthwindDataProvider: Controller可直接调用:如 //获取document表全部数据 NorthwindDataProvider. ...
- Jedis Cluster源码分析
最近一个项目用到Jedis客户端,需要对这个客户端进行改造.看了一下Jedis Cluster源码,做个记录 首先,说核心内容, 在Jedis源码中,关于cluster有个两个重要的map.一个是no ...
- PHP性能检测与优化—XHProf 数据阅读
PHP性能检测与优化—XHProf 数据阅读 一. 效果如下 请求总揽 函数调用情况 二. 参数含义 Inclusive Time 包括子函数所有执行时间 ...
- Kafka监控利器
开发过程中,kafka几乎是标配的Mq,如果有一个kafka的监控助手,哪就更完美了,常用的kafka监控工具有 KafkaOffsetMonitor .Kafka Manager.Capillary ...
- xshell连不上虚拟机linux的解决办法
1.找到Linux系统的ip地址 输入命令 ifconfig 2.打开本地网络连接 将VMnet1的ip地址设置为和虚拟机ip同一网段的ip 比如虚拟机Linux系统的ip为 192.168. ...