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. docker 摘要(入门版)

    Docker 安装 macOS或者windows 下载boot2docker工具 CentOS yum install docker-io -y systemctl start docker dock ...

  2. bootstrap-table使用记录

    效果如图所示: 1.框架用的flask 目录结构如下: 2.前端代码如下: table-test1.html <!DOCTYPE html> <html> <head&g ...

  3. 原生js与jquery的区别

    1.选择器: js: $('.car_img_con img')[0]; var jsObj = document.getElementsByClassName('sel_index_block')[ ...

  4. solidity数据类型

    1.Bool类型 取值:true/false 运算符:!  && || == != 2.Integer整型 uint8-uint256 int8-int256 uint == uint ...

  5. 2017年9月22日 关于JS数组

    JS数组 JS数组的定义方法 var arr = []; var arr = new Array() JS数组属性 长度 arr.length 遍历数组 索引值:从0开始数 第一种方法 for(var ...

  6. openssl命令使用

    openssl openssl是个密码工具集,提供多端接口调用方式 组成: 1. 代码库 libcryto ,libssl(ssl/tls) 2. 工具集 openssl 对称加密 对称加密主要是用a ...

  7. null 和 undefined 区别

    ---恢复内容开始--- 1.在javascipt中,将一个变量赋值为undefined 或 null ,几乎没什么区别. 2. 在if语句中undefined  和 null 都会被自动转成fals ...

  8. CSS如何设置换行文字自动对齐

    CSS如何设置换行文字自动对齐 如图所示: 代码实现如下: <ul class='warn-page-content'>                <li>         ...

  9. ArcGIS Enterprise 10.5.1 静默安装部署记录(Centos 7.2 minimal)- 3、安装Portal for ArcGIS

    安装Portal for ArcGIS 解压portal安装包,tar -xzvf Portal_for_ArcGIS_Linux_1051_156440.tar.gz 切换到arcgis账户静默安装 ...

  10. WinBatch基础命令

    1.echo --> echo[{on|off}][message] Simple -->: @echooff echo hello world 2.@ -->@echo off 3 ...