SharePoint 2013

ทำ Breadcrumb ให้ถูกต้องใน Publishing site

Submitted by ezybzy on Wed, 2015-12-23 - 15:31

Breadcrumb เป็นรูปแบบการกระโดดย้อนไปยังหน้าเว็บที่ผ่านมาที่คลาสสิคอีกรูปแบบหนึ่ง จนทุกวันนี้ในหลาย ๆ เว็บที่มีความเป็นโครงสร้างก็ยังคงมีการใช้งานมันอยู่ แม้ว่า SharePoint 2013 จะพยายามเอามันออกไปจากหน้าจอ แต่จนแล้วจนรอดด้วยความต้องการของลูกค้า หรือของทางผู้ออกแบบก็ยังหยิบยกมันขึ้นมาใช้ แต่จะทำอย่างไรจึงได้ Breadcrumb ที่ถูกต้องเหมาะสมกับสถานการณ์มาใช้ใน SharePoint 2013 ล่ะ?

Secure Store Service isn't available in SharePoint Foundation 2013

Submitted by ezybzy on Fri, 2013-08-23 - 16:56

UPDATE: Microsoft confirms that they will remove this feature from SharePoint Foundation. It is an expected behavior.

After a lot of searching, I figure out its root clause.

Using ILSpy to see inside method Microsoft.Office.SecureStoreService.Server.SecureStoreServiceApplicationProxy.Execute(), the first condition check is as follows:

if (Licensing.HasExpired)
{
    ULS.SendTraceTag(1731227190u, ULSCat.msoulscat_SPS_SecureStoreService, ULSTraceLevel.High, "The trial period for this product has expired or this feature is not supported in this SKU.");
    throw new ProductExpiredException(Resources.ResourceManager.GetString("Sss_InvalidSku"));
}

Digging deeper inside Microsoft.Office.Server.Administration.Licensing class, there is a boolean property HasExpired which returns result depending on following conditions:

get
{
    return Licensing.m_ExpirationFileTime != 9223372036854775807L && DateTime.UtcNow.ToFileTime() > Licensing.m_ExpirationFileTime;
}

Note: the number shown above is the constant long variable named LicensedExpirationFileTime.

The static field m_ExpirationFileTime is set by the static constructor of this class.

Licensing.m_ExpirationFileTime = -9223372036854775808L;
try
{
    ULS.SendTraceTag(1634366517u, ULSCat.msoulscat_OSRV_SetupUpgrade, ULSTraceLevel.High, "Initializing Licensing API. This trace forces the initialization of ULS");
    Licensing.m_ExpirationFileTime = Licensing.GetExpirationFileTimeFromRegistry();
}
catch (LicensingException ex)
{
    ULS.SendTraceTag(926447969u, ULSCat.msoulscat_OSRV_SetupUpgrade, ULSTraceLevel.High, "{0}", new object[]
    {
        ex.ToString()
    });
}

The GetExpirationFileTimeFromRegistry() method calls native method named GetExpirationTime() from OfficeServerSettings.dll which isn't bundled with SharePoint Foundation! (There is no %PROGRAMFILES%\Microsoft Office Server\15.0\Bin directory.) The following errors are shown in ULS.

[DATETIME]  psconfigui.exe (0x0764)                     0x0BF4  SharePoint Server               Setup and Upgrade               ajt5    High        Initializing Licensing API. This trace forces the initialization of ULS  
[DATETIME]  psconfigui.exe (0x0764)                     0x0BF4  SharePoint Server               Setup and Upgrade               78ya    High        Microsoft.Office.Server.Administration.LicensingException: An error was encountered getting expiration info. ---> System.DllNotFoundException: Unable to load DLL 'OfficeServerSettings.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)     at Microsoft.Office.Server.Administration.Licensing.NativeMethods.GetExpirationTime(Int64& expirationTime)     at Microsoft.Office.Server.Administration.Licensing.GetExpirationFileTimeFromRegistry()     --- End of inner exception stack trace ---     at Microsoft.Office.Server.Administration.Licensing.GetExpirationFileTimeFromRegistry()     at Microsoft.Office.Server.Administration.Licensing..cctor()   

If the library is supplied, we will need to see which registry key is checked which I won't do for sure. The easiest way to solve this problem is letting Microsoft remove the checking (the first code snippet) from method Microsoft.Office.SecureStoreService.Server.SecureStoreServiceApplicationProxy.Execute().

Finally, we should get SSS administration page on SharePoint Foundation!

Blog Tags

ลง Language Pack ให้ SharePoint 2013

Submitted by ezybzy on Thu, 2013-07-04 - 13:22

ในที่สุด Language Pack ภาษาไทยก็ออกมาให้ได้ติดตั้งเสียที กระบวนการติดตั้งก็ไม่ได้ซับซ้อนอะไรมาก แต่ก็อาจจะมีจุดที่ตกหล่นไปบ้าง เราสามารถแบ่งกระบวนการออกได้เป็น 2 กรณีคือ

กรณีการติดตั้งแบบสะอาด (ตั้ง Farm ใหม่, เพิ่มเครื่องใหม่) กรณีนี้ง่ายคาดเดาได้ไม่ยาก คือ ติดตั้ง SharePoint ตามด้วย Language Pack ตามด้วย Hotfix แล้วจึงรัน Configuration Wizard หากนำเครื่องเข้า Farm จำเป็นต้องติดตั้ง Language Pack ในเครื่องอื่น ๆ ก่อนที่จะนำเข้า Farm (ดูกรณีถัดไป)

กรณีการติดตั้งต่อจากของเดิม กรณีนี้ที่อาจจะพลาดกันก็คือ การติดตั้ง Language Pack แล้วเรียกใช้ Configuration Wizard เลย ซึ่งจริง ๆ แล้วจะไม่สมบูรณ์ หากเราได้ทำการติดตั้ง Hotfix ลงไปในระบบก่อนหน้านั้น เราจำเป็นต้องติดตั้ง Hotfix อีกครั้ง เพื่อให้ Resource ของ Language Pack ถูกอัพเดตให้สอดคล้องกับ Hotfix ที่ติดตั้งไปด้วย จากนั้นจึงเรียกใช้งาน Configuration Wizard

แต่ก็มีประเด็นที่น่าสนใจอีกอย่าง ณ ปัจจุบันนี้ (ต้นกรกฎาคม 2556) ทาง Microsoft ได้ออก Public Update สำหรับ SharePoint ออกมา 1 ตัว (March 2013) แต่เพิ่งจะออก Language Pack ช่วงปลายเมษายน ทำให้ผมไม่แน่ใจว่าจะสามารถติดตั้ง Language Pack ได้ก่อนที่จะติดตั้ง PU หรือไม่ ในขั้นนี้อาจจะต้องเผื่อเวลาในการติดตั้งไว้ด้วย นั่นคือ ติดตั้ง SharePoint / Hotfix / LP / Hotfix ตามลำดับ แต่หากสามารถติดตั้ง LP โดยไม่ต้องติดตั้ง Hotfix ก่อนก็จะลดเวลาลงไปได้พอสมควร ยิ่งกรณีเครื่องที่เริ่มใช้งานแล้ว การติดตั้ง Hotfix แต่ละหนใช้เวลาดำเนินการค่อนข้างนาน อาจไม่ใช่เรื่องสนุกที่จะต้องมานั่งรอการติดตั้ง

Blog Tags

เรื่องของ People parameter ใน Workflow 2010 และ 2013

Submitted by ezybzy on Mon, 2013-05-20 - 22:47

ใน SharePoint 2010 บน Workflow Initiation/Association Form เมื่อเราต้องการ Parameter สำหรับใส่ People เราสามารถสร้างมันได้จาก SharePoint Designer ซึ่งค่าที่ได้นี้เมื่อถูกนำไปใช้ต่อใน Workflow ในรูปแบบของการสั่ง To string เราจะได้ XML ที่ Malform มาก้อนหนึ่งที่บรรจุรายละเอียดของ People แยกเป็นรายคน ทั้งนี้เนื่องจากฟอร์มดังกล่าวถูกสร้างมาด้วย InfoPath โดยอัตโนมัติ

ใน SharePoint 2013 หากยังคงทำงานกับ Workflow 2010 เราก็ยังคบพฤติกรรมที่เป็นปัญหาแบบเดิม แต่หากเราใช้ Workflow 2013 ฟอร์มดังกล่าวจะกลายเป็น ASP.net Form ทำให้ค่าของ Parameter นี้มีรูปแบบการบันทึกข้อมูลที่เปลี่ยนไป นั่นคือมันจะถูกเก็บเป็น User claim คั่นด้วย ; แทนแล้ว ทำให้เมื่อมีเหตุจำเป็นต้องส่งไปให้ Web Service จัดการประมวลผลค่านี้ อาจจะต้องทำการปรับเปลี่ยนวิธีคิดใหม่ เพราะข้อสันนิษฐานว่าจะเจอ Malform XML นั้นผิดเสียแล้ว

Blog Tags