จับ SharePoint Workflow 2013 มาชนกับ User Profile

Submitted by ezybzy on Mon, 2013-06-10 - 20:57

ได้รับความต้องการสนุก ๆ มาข้อหนึ่งในการทำ SharePoint Workflow 2013 นั่นคือ มันต้องหา Manager ของ User ที่เป็นคนสร้างเอกสารให้ได้ เพื่อขออนุญาตทำกิจกรรมบางอย่าง (สร้าง Task ให้ Manager นั่นเอง)

ตอนแรกก็คิดว่าถึงคราวที่จะต้องขุด REST API ของ SharePoint ขึ้นมาผสมกับ Call Web Service ซึ่งเป็น Action ใหม่ใน SharePoint Workflow 2013 แล้วก็เป็นเช่นนั้น แต่หนทางมันกลับไม่ได้ง่ายอย่างที่คาด

จากบทความ Work with user profiles in SharePoint 2013 มองดูรอบ ๆ มีตัวอย่างหนึ่งที่เราใช้ได้เลยนั่นก็คือ

REST: GET http://<siteUri>/_api/SP.UserProfiles.PeopleManager/GetUserProfilePropertyFor([email protected],propertyName='PreferredName')[email protected]='domain\user'

ทำการแก้ไขนิดหน่อยเปลี่ยนจาก PreferredName เป็น Manager แทน แต่ทีนี้ปัญหาที่พบก็คือ url ด้านบนนี้ โดยค่าปริยายผลลัพธ์ที่ SharePoint จะตอบกลับมาจะเป็น XML ซึ่งไม่สามารถนำมาใช้ต่อบน SharePoint Designer Workflow ได้

เราจำเป็นต้องปรับเปลี่ยนนิดหน่อยโดยการปั้น Request Header เพิ่มเข้าไปเพื่อบังคับให้ผลลัพธ์ที่ตอบกลับมาเป็น json ตามแบบที่ Action ตัวนี้คาดหวังไว้ วิธีการตามที่ Serge Luca ได้อธิบายไว้ใน Calling the SharePoint 2013 Rest API from a SharePoint Designer Workflow นั่นคือ ใช้ Action ชื่อ Build Dictionary สร้าง Dictionary ที่มีคีย์และค่าดังนี้

Accept : application/json;odata=verbose
Content-Type : application/json;odata=verbose

พรุ่งนี้มาดูผลว่า จะได้ตามที่ Luca แนะนำไว้หรือไม่ ยังไม่พอครับ ต้องมี header พิเศษอีกตัวนั่นคือ Authorization (ดู Kevin.Talbot) แล้วก็จะมีประเด็นอีกเรื่องคือ Login Name ที่ได้มามันไม่ใช่ full domain แต่กลายเป็น claim แทนซึ่งมีปัญหาตรง # ซึ่งอาจจะต้องแก้ให้เป็น %23 แทน

เมื่อเราใช้ Action ชื่อ Get Item from Dictionary ดึง Manager ออกมาแล้วจากผลลัพธ์ของ Call HTTP Service จะพบว่ามันอยู่ในสภาพ domain\username ทำให้ต้องใช้ Replace String เปลี่ยน \\ เป็น \ แล้วเมื่อจะนำไปใช้ในการสร้าง Task หรือแม้แต่การตรวจสอบ User จำเป็นต้อง Cast ค่าให้กลับมาเป็น Login Name อีกหน มิเช่นนั้น Workflow อาจจะถูก Suspended ได้

ออ นอกจากนี้ยังมีตัวอย่างการทำ POST เข้าหา REST เช่นกัน ดูตัวอย่างของ Borislav Grgić ก็สามารถนำไปทำกิจกรรมบางอย่างได้ แต่ทั้งนี้ก็ขึ้นกับสิทธิ์ของคนสั่ง Workflow นั่นเองว่าจะสามารถทำได้หรือไม่

Blog Tags

ข้อควรระวังในการลบ User ออกจาก Site Colleciton

Submitted by ezybzy on Fri, 2013-06-07 - 14:40

เป็นปรกติที่บริษัทรับพัฒนา SharePoint อาจจะทำการย้าย Farm, Site Collection ที่พัฒนาจากที่บริษัท ออกไปติดตั้งยังไซต์ลูกค้า ซึ่งแน่นอนว่า Active Directory ที่ใช้งานนั้นเป็นคนละตัว ทำให้มี User ที่เกิดจาก Active Directory ของบริษัท ติดไปในระบบที่ส่งมอบแก่ลูกค้าด้วย ผู้ดูแลระบบผู้หวังดีอาจจะตรวจพบ User กลุ่มนี้และใจดีทำการลบออกจากระบบให้ นั่นก็นำมาซึ่งปัญหาอันแสนน่ากลัว

ปัญหาที่พบได้บ่อยคือ Workflow ที่เคยทำงานได้ดีใน Site Collection นั้นเกิดหยุดทำงานพร้อมกันโดยมิได้นัดหมาย เมื่อลองใช้ SharePoint Designer เปิดดูอาจจะพบอาการเปิดหน้าเว็บไม่ได้ (หน้าตาใน SharePoint Designer มันมี View บางส่วนแสดงผลเป็นหน้าเว็บได้ด้วย) ลองกดดู Workflow Settings ทุกจุดใน Site ก็พบ error ประมาณเดียวกันคือ User cannot be found ซึ่งใน ULS ก็ไม่ได้บอกอะไรที่มีประโยชน์นัก

หาสาเหตุอยู่ตั้งนานกว่าจะทราบสาเหตุ พอมาเปิดดู Workflow ทั้งหมดในระดับ Site Collection จึงเพิ่งสังเกตว่าผู้สร้าง OOB Workflow ทั้งหลายเป็น User ที่หายไปแล้ว ทางแก้คือ ใช้ User ที่มีอยู่ในระบบเข้าไปจัดการ Publish Workflow ดังกล่าวใหม่ทั้งหมด หลังจากนั้นการทำงานของ Workflow จึงกลับมาเป็นปรกติอีกครั้ง

ข้อเตือนใจคือ อย่าเผลอหวังดีไปไล่ลบ User อีก เว้นเสียแต่จะรู้ว่าควรจะต้องแก้อะไรอีกบ้าง

Blog Tags

โบว์สีขาว

Submitted by ezybzy on Thu, 2013-05-30 - 12:05

หลังจากที่กระทรวงศึกษายกเลิกกฎอันเนื่องมาจาก ปว. เรื่องระเบียบทรงผมของนักเรียน เมื่อเช้าขณะรถติดอยู่แถวสะพานผ่านฟ้า ผมได้เห็นนักเรียนหญิงโรงเรียนแถว ๆ นั้นคนหนึ่งซึ่งโรงเรียนนี้ได้ชื่อว่ามีระเบียบทรงผมที่เป็นเอกลักษณ์มาก ไว้ผมยาวผูกโบว์สีขาวเดินข้ามถนนผ่านไป สงสัยว่าความเปลี่ยนแปลงคงจะมาถึงแล้ว

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

อันเนื่องจากการติดตั้ง SharePoint 2013 ใหม่อีกรอบ

Submitted by ezybzy on Fri, 2013-05-10 - 15:38

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

ขั้นตอนการติดตั้งแทบจะเป็นแบบเดิมทุกประการ มีที่แตกต่างไปในครั้งนี้คือ มีการแยก Workflow Manager ออกจากเครื่อง SharePoint (คราวก่อนรวมไว้บนเครื่อง SharePoint เลย) ซึ่งจะพบปัญหาในขั้นตอนการสั่ง Register-SPWorkflowService อันนี้ก็ลักไก่ไปเพิ่มสิทธิ์ db_owner หรือ SPDataAccess ใน Content Database ของ SPSite ที่ต้องการผูกบริการเอาดื้อ ๆ เลย เพราะแอคเคาท์ติดตั้ง SharePoint ไม่มีสิทธิ์บน SharePoint Content Database (และหลาย ๆ Database) โดยปริยายเหมือนที่เคยคาดไว้

สำหรับ User Profile Service Application และบริการที่เกี่ยวข้อง (Managed Metadata Service, Search, และอะไรซักอย่าง) ก็สร้างขึ้นทีหลังเช่นเคย (รวมถึง Workflow ด้วยเพราะต้องรอ User Profile Service Application เสร็จก่อน) ครั้งนี้ได้บทเรียนมาว่า ให้เปิด User Profile Service ใน Services on Server รอไว้ก่อนจะสร้างได้เลยเพื่อไม่เป็นการเสียเวลา พอสร้างเสร็จตรวจเช็คว่าสามารถเข้าไปในหน้าของ User Profile Service Application ได้ก็ค่อยกลับมาเปิด User Profile Synchronization Service อีกที ซึ่งแน่นอนว่าอาจจะเปิดไม่สำเร็จ ทางแก้ก็คือ Restart เครื่อง SharePoint ซักรอบแล้วทำใหม่ ส่วนในกระบวนการทดสอบ Synchronization จริง ๆ ต้องใช้ ADSI Edit ที่อยู่บนเครื่อง Active Directory ทำการเพิ่มสิทธิ์ในการ Replication Directory Change ให้ (อันนี้ค่อย ๆ ลองทำ ต้องตรวจจาก Log ที่เกิดขึ้นว่ามันฟ้องว่าติดปัญหาที่ใด)

กลับมาที่ Workflow Manager อีกครั้งตอนสร้าง จะสร้างกลุ่มจัดการอยู่ในระดับโดเมนหรือแค่ Local Machine ก็ตามสะดวก แต่โดยปริยายของ Powershell Script ที่ถูกสร้างขึ้นมาจะให้ BUILTIN\Administrators ที่อยู่ในเครื่องที่ติดตั้ง Workflow Manager มีสิทธิ์จัดการ Service ดังนั้นจึงจำเป็นต้องเพิ่มแอคเคาท์ที่จะใช้สั่ง Register-SPWorkflowService เข้าไปในกลุ่มนี้ด้วย

มาจุดที่ระทึกอีกจุดคือ การทำให้เครื่องพร้อมใช้งานสำหรับการพัฒนา App ได้อันนี้ทำตามบทความใน MSDN ได้เลย เพียงแต่ว่าเมื่อกำหนด SPAppDomain ควรตั้งเป็นโดเมนที่เหมือนจะมีอยู่จริง ใช้เป็นชื่อเครื่องไม่ได้ เพื่อความเรียบง่ายในการจัดการอาจจะไปเพิ่ม Record บน DNS ด้วยเพื่อให้เครื่องที่อยู่ในวง DNS เดียวกันสามารถเรียกหา App ได้โดยสะดวก (สำหรับ SharePoint-hosted) ส่วน Provider-hosted ตอนนี้ยังติดปัญหาอยู่ ถ้าแก้ไขได้แล้วจะกลับมาสรุปผลอีกครั้ง

Blog Tags

หลังจากฤดูที่ฉันเหงา

Submitted by ezybzy on Thu, 2013-05-09 - 22:22

ประโยคที่เธอเคยพูดเมื่อสองสามปีก่อนมันก็ย้อนกลับมากระทบจิตใจตลอดเวลา ขอโทษนะที่พี่ทำอะไรไม่ดีไว้ ถึงพูดตอนนี้มันก็คงสายไปแบบที่แป้งโกะพูด ถ้าเป็นไปได้พี่ควรจะเตรียมพร้อมกว่านี้

Blog Tags