Christophe Fiessinger's Blog
Updates on Microsoft's Enterprise Social Networking (ESN) and Project Portfolio Management (PPM) offerings

  • Christophe Fiessinger's Blog

    SharePoint Performance Tuning References

    Thanks to Roger Lamb please find references to improve SharePoint’s and Project Server performance:

    Development specific tips:

    Upcoming book: Microsoft® Office SharePoint® Server 2007 Best Practices

    Achieve your IT objectives with proven, best-practice guidance on using SharePoint solutions.

    Get field-tested best practices and proven techniques for designing, deploying, operating, and optimizing Microsoft Office SharePoint Server 2007 and Windows SharePoint Services 3.0. Part of the new Best Practices series for IT professionals from Microsoft Press®, this guide is written by leading SharePoint MVPs and Microsoft SharePoint team members who’ve worked extensively with real-world deployments and customers. You’ll find out how to deploy the software, design your environment, manage content, analyze and view data, perform disaster recovery, monitor performance, and more. You'll learn how to create SharePoint sites that help your organization collaborate, take advantage of business insights, and improve productivity—with practical insights from the experts.

  • Christophe Fiessinger's Blog

    How to check Project 2007 version using VBA?

    [ Updated 4/25/2011 – modified code to support Windows 7, please not that this functionality is out of the box in Project Server 2010 and no longer requires such VBA script!]

    A great question we heard this morning during the Project 2007 SP2 webcast and every time we release a server and desktop software update for Project 2007 and Project Server 2007, is how do I ensure the desktop contains the proper software updates? For instance how I do ensure that ALL desktop version for Project that connect to Project Server have Service Pack 2 installed?

    Thanks to Adrian Jenkins please find below two easy way to achieve this by leveraging VBA (macro) within the Enterprise Global.
    A quick demo first:
    I try to save a plan and I will get the following warning:
    and WinProj will automatically be closed!
    image

    In this first approach change MIN_PROJ_VERSION to the latest SP2 version number: 6425 

    Feel free to customize the Warning message at will!

    Declare Function RegCloseKey& Lib "advapi32.dll" (ByVal hKey&) 
    Declare Function RegOpenKeyExA& Lib "advapi32.dll" (ByVal hKey&, ByVal lpszSubKey$, ByVal dwOptions&, ByVal samDesired&, lpHKey&) 
    Declare Function RegQueryValueExA& Lib "advapi32.dll" (ByVal hKey&, ByVal lpszValueName$, ByVal lpdwRes&, lpdwType&, ByVal lpDataBuff$, nSize&) 
    Declare Function RegQueryValueEx& Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey&, ByVal lpszValueName$, ByVal lpdwRes&, lpdwType&, lpDataBuff&, nSize&)
    
    Const MIN_PROJ_VERSION = 6330
    
    Const HKEY_CLASSES_ROOT = &H80000000
    Const HKEY_CURRENT_USER = &H80000001
    Const HKEY_LOCAL_MACHINE = &H80000002
    Const HKEY_USERS = &H80000003
    
    Const ERROR_SUCCESS = 0&
    Const REG_SZ = 1&                          ' Unicode nul terminated string
    Const REG_DWORD = 4&                       ' 32-bit number
    
    Const KEY_QUERY_VALUE = &H1&
    Const KEY_SET_VALUE = &H2&
    Const KEY_CREATE_SUB_KEY = &H4&
    Const KEY_ENUMERATE_SUB_KEYS = &H8&
    Const KEY_NOTIFY = &H10&
    Const KEY_CREATE_LINK = &H20&
    Const READ_CONTROL = &H20000
    Const WRITE_DAC = &H40000
    Const WRITE_OWNER = &H80000
    Const SYNCHRONIZE = &H100000
    Const STANDARD_RIGHTS_REQUIRED = &HF0000 
    Const STANDARD_RIGHTS_READ = READ_CONTROL 
    Const STANDARD_RIGHTS_WRITE = READ_CONTROL 
    Const STANDARD_RIGHTS_EXECUTE = READ_CONTROL 
    Const KEY_READ = STANDARD_RIGHTS_READ Or KEY_QUERY_VALUE Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY 
    Const KEY_WRITE = STANDARD_RIGHTS_WRITE Or KEY_SET_VALUE Or KEY_CREATE_SUB_KEY 
    Const KEY_EXECUTE = KEY_READ
    
    Sub ProjectVer()
    
        Dim projVersion As String
        Dim version As String
        
        projVersion = RegGetValue$(HKEY_LOCAL_MACHINE, "Software\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\00002109B30000000000000000F01FEC\InstallProperties", "DisplayVersion")
        version = Mid(projVersion, 6, 4)
        If (CInt(version) < MIN_PROJ_VERSION) Then
            
            MsgBox "Your version of Winproj.exe is not valid and may cause problems." & Chr(13) & Chr(13) & _
            "The installation of new version of Microsoft Project is required!" & Chr(13) & Chr(13) & _
            "Required Version: " & Left(projVersion, 5) & MIN_PROJ_VERSION & ".XXXX" & (Chr(13)) & _
            "Found Version:     " & projVersion & Chr(13) & Chr(13) & _
            "Microsoft Project will now Exit." _
            , vbExclamation, "Program Version Check"
            
            Application.FileExit pjDoNotSave
            
        End If
        
    End Sub
    
    Function RegGetValue$(MainKey&, SubKey$, value$)
       ' MainKey must be one of the Publicly declared HKEY constants.
       Dim sKeyType&       'to return the key type.  This function expects REG_SZ or REG_DWORD
       Dim ret&            'returned by registry functions, should be 0&
       Dim lpHKey&         'return handle to opened key
       Dim lpcbData&       'length of data in returned string
       Dim ReturnedString$ 'returned string value
       Dim ReturnedLong&   'returned long value
       If MainKey >= &H80000000 And MainKey <= &H80000006 Then
          ' Open key
          ret = RegOpenKeyExA(MainKey, SubKey, 0&, KEY_READ, lpHKey)
          If ret <> ERROR_SUCCESS Then
             RegGetValue = ""
             Exit Function     'No key open, so leave
          End If
          
          ' Set up buffer for data to be returned in.
          ' Adjust next value for larger buffers.
          lpcbData = 255
          ReturnedString = Space$(lpcbData)
    
          ' Read key
          ret& = RegQueryValueExA(lpHKey, value, ByVal 0&, sKeyType, ReturnedString, lpcbData)
          If ret <> ERROR_SUCCESS Then
             RegGetValue = ""   'Value probably doesn't exist
          Else
            If sKeyType = REG_DWORD Then
                ret = RegQueryValueEx(lpHKey, value, ByVal 0&, sKeyType, ReturnedLong, 4)
                If ret = ERROR_SUCCESS Then RegGetValue = CStr(ReturnedLong)
            Else
                RegGetValue = Left$(ReturnedString, lpcbData - 1)
            End If
        End If
          ' Always close opened keys.
          ret = RegCloseKey(lpHKey)
       End If
    End Function

    Another way to validate the desktop version, uses the file system. The only challenge with this approach is determining the location of the Program Files directory.

    Sub projVersion()
        Dim MainFolderName As String
        Dim LastMod As String
        Dim Created As String
        Dim Size As String
        Dim projVersion As String
          
        Set objShell = CreateObject("Shell.Application")
       
        MainFolderName = "C:\Program Files\Microsoft Office\Office12"
         
        Set FSO = CreateObject("scripting.FileSystemObject")
        Set oFolder = FSO.GetFolder(MainFolderName)
         'error handling to stop the obscure error that occurs at time when retrieving DateLastAccessed
        On Error Resume Next
        For Each fil In oFolder.Files
    
            Set objFolder = objShell.Namespace(oFolder.Path)
            Set objFolderItem = objFolder.ParseName(fil.Name)
                    
            Select Case UCase(fil.Name)
                Case Is = "WINPROJ.EXE"
                    LastMod = fil.DateLastModified
                    Created = fil.DateCreated
                    Size = fil.Size
                    MsgBox ("File: " + fil.Name + " Last Modified: " + LastMod + " Created: " + Created + " Size: " + Size)
                    'do all of the normal tests here to determine which version you need and which you have. See above.
            End Select
            
        Next
    
    End Sub
  • Christophe Fiessinger's Blog

    Project in a Terminal Services environment

    Please find below useful links when deploying Project Standard or Project Professional on a Terminal Services (or Citrix) environment.

    A common issue I have heard/seen is that the version used on Terminal Services is incorrect (you need a Volume License Key) with this type of error message displayed: "This copy of Microsoft Office Project cannot be used on Terminal Server".

    This issue is addressed in the following knowledge base article: http://support.microsoft.com/kb/924622

    Other useful links are:

  • Christophe Fiessinger's Blog

    Microsoft Office 2010, Microsoft SharePoint Server 2010, Microsoft Visio 2010 and Microsoft Project 2010 Availability

    As part of the Exchange 2010 announcement today: Microsoft Unveils Exchange 2010 With Public Beta we also announced a timeline for the next version of Office products (see First in Wave and Availability sections):

    • Microsoft Office 2010
    • Microsoft SharePoint Server 2010
    • Microsoft Visio 2010
    • Microsoft Project 2010

    Microsoft Office 2010, Microsoft SharePoint Server 2010, Microsoft Visio 2010 and Microsoft Project 2010 are scheduled to enter technical preview in the third quarter of 2009 and release to manufacturing in the first half of 2010.

    Note the name change to Project; the “Office” piece was removed (so we will ship a Microsoft Project Professional 2010, Microsoft Project Server 2010, for instance). More information from the SharePoint team on the new name change here.

    To learn all about Project 2010, I encourage everyone to attend Microsoft Project Conference 2009 in September.

  • Christophe Fiessinger's Blog

    Microsoft Project Server 2010 Hardware and Software Requirements

    It’s now officially on TechNet for SharePoint and since Project Server 2010 is built on SharePoint Server 2010 the same requirements applies: Determine hardware and software requirements (SharePoint Server 2010) image

  • Christophe Fiessinger's Blog

    The Rise of Enterprise Social Networks by @markfidelman

    The following white paper was released this week and available for download from Microsoft: The Rise of Enterprise Social Networks. This 26 pages whitepaper from Mark Fidelman is a good read to help you help understand the business value of Enterprise Social and how to get started :

    Social technologies, combined with data analysis and mobile technologies are significantly enhancing an organization’s ability to be responsive to market changes and will enable employees to work on the tasks that most benefit the company at any given point in time. In the near future, companies utilizing enterprise social software will be able to spot trends, provide information to thier employees in context, and leverage the wisdom of the organization to rapidly complete tasks and surface previously hidden pockets of valuable information.

    Chapter summary:

    • Welcome to the Enterprise Social Revolution
    • You Need a Digital Village
    • The Evolution of Enterprise Collaboration
    • The Business Value of Enterprise Social
    • The Four Building Blocks for a Successful ESN Building
    • Mapping the Strategy for the Rest of the Business
    • Success initiatives for enterprise social companies
    • Why Microsoft is Best Positioned in the Space
    • Tying it all together
    • Action items & Questions to ask your organization

    The Rise of Enteprise Social Networks

    I have also read this book from Mark Fidelman which I also recommend: Socialized! How the Most Successful Businesses Harness the Power of Social (Social Century Series).

    Happy reading!

  • Christophe Fiessinger's Blog

    Project Server 2010 Delegation Audit Event Handler

    On of the great new feature for Project Server 2010 is the ability to delegate Project Web App (PWA) to a colleague while you are out of the office, check the Project 2010 Ignite Administration slides and recordings for more information (Download Project 2010 Ignite Recordings and Slides). One of the many feedback I heard during the Ignite worldwide tour was to make it easier to track who became a delegate of who and when. Finally found some time to provide an example to address this request. I basically built a custom event handler that overrides these two UserDelegation events: OnActivated  and OnDeactivated (which are called when you click on either Start Delegate Session and Stop Delegate Session in PWA:

    DelegationBy definition this information is stored in the ULS logs, so to make it easier to report, every time the above two events are fired I store in a custom table the delegate session information. After 2 hours of coding and testing voila! My very first Project Server 2010 custom event handler, so easy to do even a marketing guy can do it! Once the custom handler is running you can then leverage Excel and Excel Services to built a report that renders an audit of all Delegate activity in your PWA instance (as shown below). I just love the ease of extensibility of 2010…

    Code download is location on MSDN Code Gallery: Project Server 2010 Delegation Audit Event Handler

    Partial extract of C# code

    // Track Delegation Activation
    public override voidOnActivated(PSContextInfo contextInfo, UserDelegationActivatePostEventArgs e)
    {
        // Standard processing
      
    base.OnActivated(contextInfo, e);

        // Build T-SQL command
      
    stringcmdText = string.Format("EXEC PS2010_InsertDelegationActivationChange '{0}','{1}',1", e.Delegation.DelegateUid.ToString(), e.Delegation.ResUid.ToString());

        // Store Resource field update
      
    ConnectAndExecuteNonQuery(connectionString, cmdText);
    }

    // Track Delegation Deactivation
    public override voidOnDeactivated(PSContextInfo contextInfo, UserDelegationDeactivatePostEventArgs e)
    {
        // Standard processing
      
    base.OnDeactivated(contextInfo, e);

        // Build T-SQL command
      
    stringcmdText = string.Format("EXEC PS2010_InsertDelegationActivationChange '{0}','{1}',0", e.Delegation.ResUid.ToString(), e.Delegation.DelegateUid.ToString());

        // Store Resource field update
      
    ConnectAndExecuteNonQuery(connectionString, cmdText);
    }

    Partial extract of T-SQL stored procedure used

    	INSERT INTO dbo.PS2010_UserDelegationAudit (
    		ACTIVATION_UID,
    		DELEGATE_NAME,
    		RES_NAME,
    		DELEGATE_UID,
    		RES_UID,
    		START_DELEGATE,
    		ACTIVATION_DATE
    		) 
    	VALUES
    	(NEWID(),
    	@DelegateName,
    	@ResourceName,
    	@DelegateUID,
    	@ResourceUID,
    	@StartDelegate,
    	GETDATE()
    	)

    Sample Report

    image

    Please find below a brief code sample if you want to create delegate programmatically (a clean way would be to create a PowerShell cmdlet to automate the C# logic creation):

    UserDelegationDataSet userDelegationDataSet;
    UserDelegationDataSet.ResourceDelegationsRow row = userDelegationDataSet.ResourceDelegations.NewResourceDelegationsRow();
    Guid delegationUID = Guid.NewGuid();
    row.DELEGATE_UID = delegateUID; 
    row.RES_UID = resUID; 
    row.DELEGATION_FINISH = endDate;
    row.DELEGATION_START = startDate;
    row.DELEGATION_UID = delegationUID;
    userDelegationDataSet.ResourceDelegations.AddResourceDelegationsRow(row);
    resourceProxy.CreateDelegations(userDelegationDataSet);

  • Christophe Fiessinger's Blog

    Microsoft Project 2010 Kinect Edition: You Are the Controller!

    I’m super excited to announce Microsoft Project 2010 Kinect Edition: You Are the Controller! Microsoft continues to be an industry leader in project management  software with this revolutionary new approach to Project Management. Microsoft Project 2010 Kinect Edition enables you to interact with your plan using you body, the wave of your hands and your voice. For instance simply built your schedule by waving your hands left and right; leverage the powerful resource planner view and perform resource allocation with a few gestures and voice orders. Project Portfolio Management will never be the same thanks to Microsoft Project 2010 Kinect Edition!

    Customer feedback:

    • “Microsoft nails it again! – being able to make strategic portfolio decision in front of the board members with my hands and voice made me a rocks star” Jan Kotas, CIO, Contoso Corp
    • “Planning is so much fun now and I get to work out at the same time, AGILE will never be the same – THANK YOU Microsoft I’m now so much more productive and happy“ Steve Master, PMP, President Litware PMO
    • “Being able to plan our next family vacation in the living room with my husband and kids was an awesome bounding experience” Jessica Arnold, Bellevue WA

    For more information check out: http://www.xbox.com/en-US/kinect

    Microsoft Project 2010 Kinect Edition Microsoft Project 2010 Kinect Edition

    PS: Yes it’s November 5th, 2010, but surely feels like April 1st…

  • Christophe Fiessinger's Blog

    Troubleshooting Project Server Active Directory (AD) Synchronization

    If you are having issues using AD synchronization with EPM (user not synched up for instance) you can do the following two actions to troubleshoot the sync. process:

    ·         Using “Active Directory Users and Computers” (dsa.msc) MMC snap-in, find the group to sync and if so, are the users listed under members tab?

    ·         Get detail logs of the EPM to AD sync process and analyze them.

    To activate the ULS do the following:

    1.     Go to your farm Central Administration page, select Central Administration > Operations > Diagnostic Logging

    2.     In Event Throttling, select Project Server Active Directory Synchronization category

    3.     Set Least critical event to report to the trace log as Verbose, and press OK

     

    ULS are typically located under: C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\LOGS

  • Christophe Fiessinger's Blog

    EPM & SharePoint Performance Counters

    Following Joel Oleson’s blog post on SharePoint performance counters please find below a list of EPM performance counters.

    I’m sure you are all already monitoring these in your production environment!

    Front End Perf Counters

    Back End (SQL Server) Performance Counters

    Object

    Counter

    Object

    Counter

    ASP.NET

    Application Restarts

    Processor(_Total)

    % Processor Time

    ASP.NET

    Request Execution Time

     

     

    ASP.NET

    Request Wait Time

    Memory

    Pages/sec

    ASP.NET

    Requests Queued

     

     

    ASP.NET

    Requests Rejected

    PhysicalDisk(_Total)

    Current Disk Queue Length

    ASP.NET

    Worker Process Restarts

    PhysicalDisk(_Total)

    Disk Read Bytes/sec

     

    PhysicalDisk(_Total)

    Disk Write Bytes/sec

    Memory

    Available Bytes

     

     

    Memory

    Pages/sec

    Process(sqlservr)

    % Processor Time

    Memory

    Pages/sec

    Process(sqlservr)

    Private Bytes

     

    Process(sqlservr)

    Working Set

    Process(LSASS)

    % Processor Time

     

     

    Process(OWSTIMER)

    % Processor Time

    SQLServer:Databases

    Transactions/sec

    Process(OWSTIMER)

    % Processor Time

    SQLServer:General Statistics

    User Connections

     

    SQLServer:Locks(_Total)

    Lock Wait Time (ms)

    Process(w3wp)

    % Processor Time

    SQLServer:Locks(_Total)

    Lock Waits/sec

    Process(w3wp)

    Page Faults/sec

    SQLServer:Locks(_Total)

    Number of Deadlocks/sec

    Process(w3wp)

    Page File Bytes

    SQLServer:SQL Statistics

    Batch Requests/sec

    Process(w3wp)

    Page File Bytes Peak

     

     

    Process(w3wp)

    Private Bytes

    System

    Context Switches/sec

    Process(w3wp)

    Private Bytes

     

     

    Process(w3wp)

    Virtual Bytes

     

     

    Process(w3wp)

    Virtual Bytes Peak

     

     

    Process(w3wp)

    Working Set

     

     

    Process(w3wp)

    Working Set

     

     

    Process(w3wp)

    Working Set Peak

     

     

     

     

     

    Processor(_Total)

    % Processor Time

     

     

     

     

     

    System

    Context Switches/sec

     

     

     

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib

    ProjectServer:QueueGeneral

    ProjectServer:QueueJobs

    % Sql Retries / Day

    % Jobs Failed / Day

    % Sql Retries / Hour

    % Jobs Failed / Hour

    Active Job Processing Threads

    % Jobs Retried / Day

    Average Unprocessed Jobs / Day

    % Jobs Retried / Hour

    Current Unprocessed Jobs

    Average Processing Time / Day

    New Jobs / Minute

    Average Processing Time / Minute

    Sql Calls / Hour/Day

    Average Wait Time / Day

    Sql Calls / Minute

    Average Wait Time / Minute

    Sql Retries / Minute

    Jobs Failed / Minute

     

    Jobs Processed / Hour/Day

     

    Jobs Processed / Minute

     

    Jobs Retried / Minute

     

     

    ProjectServer:Winproj

    ProjectServer:User Activity

    Average time taken for Project Open

    PSI Calls per Second

    Percentage of incremental save to full save

     

    Winproj full open count in the last hour

     

    Winproj full save count in the last hour

     

    Winproj incremental open count in the last hour

     

    Winproj incremental save count in the last hour

     

Page 5 of 69 (689 items) «34567»