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如何让系统管理员模拟普通用户创建自己的时间表的更多相关文章

  1. 使用 Web API 模拟其他用户

    模拟的要求 模拟可代表另一个 Microsoft Dynamics CRM 用户,用于执行业务逻辑(代码)以便提供所需功能或服务,它使用模拟用户的相应角色和基于对象的安全性.这项技术很有必要,因为 M ...

  2. linux 用户创建、管理、权限分配

    (1)su与sudo su:通过su可以在用户之间切换,如果超级权限用户root向普通或虚拟用户切换不需要密码,什么是权力?这就是!而普通用户切换到其它任何用户都需要密码验证: sudo: sudo扮 ...

  3. oracle用户创建及权限设置及表空间

    建立表空间: create tablespace portx_data datafile 'D:\oracle_data\portx.dbf' size 50m autoextend on next ...

  4. oracle用户创建及权限设置

    权限: create session create table unlimited tablespace connect resource dba 例: #sqlplus /nolog SQL> ...

  5. [转载]Oracle用户创建及权限设置

    出处:https://www.cnblogs.com/buxingzhelyd/p/7865194.html 权限: create session  允许用户登录数据库权限 create table  ...

  6. 写了一个Windows服务,通过C#模拟网站用户登录并爬取BUG列表查询有没有新的BUG,并提醒我

    写了一个Windows服务,通过C#模拟网站用户登录并爬取BUG列表查询有没有新的BUG,并提醒我 1.HttpUtil工具类,用于模拟用户登录以及爬取网页: using System; using ...

  7. 转载:oracle用户创建及权限设置

    权限: create session create table unlimited tablespace connect resource dba 例: #sqlplus /nolog SQL> ...

  8. oracle用户创建及权限设置(转)

    权限: create session create table unlimited tablespace connect resource dba 例: #sqlplus /nolog SQL> ...

  9. MYSQL添加新用户 MYSQL为用户创建数据库 MYSQL为新用户分配权限

    1.新建用户 //登录MYSQL @>mysql -u root -p @>密码 //创建用户 mysql> insert into mysql.user(Host,User,Pas ...

随机推荐

  1. ArcGIS发布地图服务后直接调用查看方法

    做项目配置了一个地理底图,不知道有没有问题,如何给到客户查看并确认呢? 首先在ArcGIS上发布该地图: 打开地图后->文件->共享为->服务…… 发布成功后,得到可以访问的地图服务 ...

  2. Windows 那些坑

    Windows Qt搭建 安装Qt 选择MinGW或者MSVC(建议VC), qt自动检测编译器, 基本上不用配置 去掉UWP(Windows通用平台开始, 不同于传统的exe, 它可以运行在所有的W ...

  3. HTML 5中的新特性

    HTML 5中的新特性 html5新增了一些语义化更好的标签元素.首先,让我们来了解一下HTML语义化. 1.什么是HTML语义化? 根据内容的结构化(内容语义化),选择合适的标签(代码语义化)便于开 ...

  4. 自适应布局下echarts引起页面跳帧

    项目上突然遇到一个问题,鼠标快速滑动有echarts画的饼图时,页面出现了跳帧.布局的高度突然发生变化然后恢复正常.高度怎么会变化呢?都是按百分比来的啊? 经过一番仔细观察,在跳帧的时候页面底部闪过了 ...

  5. Flowchart

    1. 工具可使用 https://www.processon.com 2.

  6. cocos2d-x 学习笔记之 CCMenuItemToggle用法

    想做用cocos2d-x做一个登陆界面,界面有有个记住账号的功能,但是该引擎我没有找到类似checkbox的类,考虑到Toggle也是开关即0和1,故考虑用这个类来实现. CCMenuItemImag ...

  7. python 正则,os,sys,hashlib模块

    简单的小算法 random随机获取数据 import random def getrandata(num): a=[] i= while i<num: a.append(random.randi ...

  8. Java—集合框架Set

    Set接口及其实现类——HashSet Set是元素无序并且不可以重复的集合,被称作集. HashSet—哈希集,是Set的一个重要实现类. Set的使用   HashSet没有像List一样的set ...

  9. C#程序集

    我的理解: 程序集是一个物理上的概念,一个项目生成的exe或者dll都可以叫做一个程序集,internal修饰的内容可以在程序集内可见.

  10. MySQL Database on Azure 支持 5.7 版本啦!

    MySQL Database on Azure 目前已经全面开放对 5.7 的支持.您可以通过管理门户,在 MySQL 数据库服务器创建时选择 5.7 版本进行体验.MySQL 5.7 版本目前是 M ...