[K2 for SharePoint] – Configuration Tip สำหรับ SharePoint 2016

สวัสดีครับ รอบนี้ได้ configure K2 4.7 กับ SharePoint 2016 มาเลยมี tip เพิ่มเติมจาก blog รอบที่แล้ว (ดูได้ที่นี่) มาให้อ่านกัน

ก่อนลง SharePoint 2016 จะเหมือนกับ 2013 คือ ต้องลง prerequisite installer ก่อน แต่ในรอบนี้ ถึงแม้ server เราจะต่อ internet ได้แต่ก็ไม่สามารถ download อะไรได้เลย สุดท้ายก็ต้องมา download เอง แต่เดี๋ยวก่อน!! ถ้าเรา download มาเองแล้วมาลงเอง อาจจะ error ใน step configure SharePoint ได้ ใน step นี้ แนะนำ http://nikcharlebois.com/installing-the-sharepoint-2016-prerequisites-offline-using-powershell/ ให้ download file จากในนี้ได้เลย และให้ใส่ command ตาม เป็นอันจบ

Step หลังจากนี้ ก็ทำเหมือนกับ SharePoint 2013 เลย หลังจากลงเสร็จก็ enable service ตามด้านล่าง (แนะนำให้ใช้ command line ทั้งหมด เพราะว่า ถ้าทำผ่าน UI จะ set บางส่วนไม่ได้)

  • Subscription Service

    $account = Get-SPManagedAccount <Account Name>
    $appPoolSubSvc = New-SPServiceApplicationPool -Name SettingsServiceAppPool -Account $account
    $appSubSvc = New-SPSubscriptionSettingsServiceApplication -ApplicationPool $appPoolSubSvc -Name SettingsServiceApp -DatabaseName <Database Name>
    $proxySubSvc = New-SPSubscriptionSettingsServiceApplicationProxy -ServiceApplication $appSubSvc

  • App Management Service

    $account = Get-SPManagedAccount <Account Name>
    $appPoolAppSvc = New-SPServiceApplicationPool -Name AppServiceAppPool -Account $account
    $appAppSvc = New-SPAppManagementServiceApplication -ApplicationPool $appPoolAppSvc -Name AppServiceApp -DatabaseName <Database Name>
    $proxyAppSvc = New-SPAppManagementServiceApplicationProxy -ServiceApplication $appAppSvc

  • User Profile Service

    $appPool = New-SPServiceApplicationPool -Name HostedAppPool -Account (Get-SPManagedAccount “<Account Name>“)
    $app_UPA = New-SPProfileServiceApplication -Name UPA -PartitionMode -ApplicationPool $appPool

    ตรงนี้จะมีความต่างจาก SharePoint 2013 นิดหน่อย ตรงที่ไม่มี User Profile Synchronization Service ให้ start แต่ในมุมของเราให้สร้าง User Profile Service ให้เรียบร้อย พอสร้างแล้วจะมีปุ่มให้กด Manage

UPS01

Configure Synchronization Connections ให้เรียบร้อย ก็จะใช้งานได้ปกติ

UPS02

UPS03

  • Enable NetBIOS สำหรับ User Profile Service Name ให้ไปดูที่หน้า App Management Service แล้วใส่ชื่อตาม

    $UserProfileServiceApp = Get-SPServiceApplication -name <User Profile Service Name>
    $UserProfileServiceApp.NetBIOSDomainNamesEnabled = 1
    $UserProfileServiceApp.Update()

  • Shell Admin grant SPShellAdmin ให้ user ที่จะเป็นคนรัน app deployment

    Add-SPShellAdmin -UserName <Account Name>
    Get-SPDatabase | ?{$_.Name -eq “<WSS Content DB>“} | Add-SPShellAdmin -Username <Account Name>
    Get-SPDatabase | ?{$_.Name -eq “<SharePoint Admin DB>“} | Add-SPShellAdmin -Username <Account Name>
    Get-SPDatabase | ?{$_.Name -eq “<SharePoint Config DB>“} | Add-SPShellAdmin -Username <Account Name>
    Get-SPDatabase | ?{$_.Name -eq “<App Management Service DB>“} | Add-SPShellAdmin -Username <Account Name>
    Get-SPDatabase | ?{$_.Name -eq “<User Profile Service DB>“} | Add-SPShellAdmin -Username <Account Name>
    Get-SPDatabase | ?{$_.Name -eq “<User Profile DB>“} | Add-SPShellAdmin -Username <Account Name>

ถ้าทำเรียบร้อยก็ให้รัน K2 for SharePoint App Deployment ได้เลย 🙂

Advertisements

[K2 SmartForms]-Upload File แบบใหญ่ๆ

สวัสดีครับ กลับมาเจอกันอีกแล้วในปลายปีที่เหมาะกับการไปเที่ยว แต่หลายๆ คนก้ไม่ได้ไปเที่ยว ยังต้องนั่งทำงานอยู่ (เหมือนผม T^T)  คราวนี้เราจะพูดถึงเรื่องที่เกือบทุก application ต้องใช้ นั่นก็คือ ไฟล์แนบ

โดยปกติไฟล์แนบที่ใช้กันใน application จะมีทางเลือกในการเก็บไฟล์ตามด้านล่าง

  1. เก็บไฟล์ใน database => สะดวก, สามารถแยก archive ได้ แต่ถ้าเก็บเยอะๆ หรือไฟล์ขนาดใหญ่ ก็จะมีปัญหาเรื่อง performance
  2. เก็บไฟล์ใน share path => เก็บไฟล์ขนาดใหญ่ได้ แต่ archive ลำบาก และในส่วนของ K2 จะต้องลง component เพิ่มเพื่อเก็บ file ลง share drive
  3. เก็บไฟล์ใน system อื่น => ที่เคยเจอมาก็เป็น SharePoint (แต่สุดท้ายก็ลงใน database อยู่ดี), WebService (ที่ไม่รู้เอาไปเก็บปลายทางไว้ที่ไหน) หรืออาจจะเป็น Document Management อย่างอื่นๆ

ในด้าน Document Management Solution ที่เกี่ยวกับ K2 ปกติจะเป็นการใช้ K2 + SharePoint โดย K2 จะเป็นตัวช่วยในการทำ application และ SharePoint จะเป็น storage ในการเก็บไฟล์ ถ้าเป็นไฟล์ขนาดเล็ก ก็คงไม่ค่อยมีปัญหาอะไร แต่ถ้าต้องเก็บไฟล์ขนาดใหญ่ล่ะ จะทำอย่างไรดี???

มาดูในฝั่ง K2 กันก่อน จาก recommendation K2 จะรองรับไฟล์ขนาดประมาณ 300 MB (ผ่านการเรียก SmartObject เพื่อ save ไฟล์ลง database) แต่ถ้าเกินกว่านี้ ไม่แนะนำ และอาจจะเจอ error ได้ ดังนั้น option ที่มีคือ การเก็บไฟล์ตรงไปที่ destination ตรงๆ เลย พอคิดได้แล้ว ก็จะมีคำถามอยู่ในใจว่า เราจะสามารถเอา file มาจาก file attachment control ของ SmartForms มา upload ได้อย่างไร?

การทำงานของ file attachment control ก็จะเหมือน control สำหรับทำ file attachment ทั่วไป คือ จะ load file ไปวางไว้ใน temporary folder ซักที่หนึ่ง แล้วค่อยเอา file ไปใช้งานต่อ โดยจะใช้ temporary folder structure ตามด้านล่าง

TempFilePath Info

(A) – เป็น fix path อยู่ใน C:\ProgramData\IsolatedStorage

(B) – จะต่างกันไปตามแต่ละ server

(C) – จะเหมือนกันในทุก server คือ StrongName.sv3o0piwfpl3mmnmzxoxnb4xggpgeagc\AssemFiles

(D) – จะ generate ใหม่ทุกครั้งที่แนบ file สามารถหาได้จาก file attachment control

TempFilePath

เมื่อเลือก file เพื่อ upload ไปแล้ว เวลาดึงข้อมูลออกมาจาก file attachment control จะได้มาในรูปของ xml ตามด้านล่าง

<collection>TestC.txt4uko05zx.hsd\TestC.txt</collection>

โดยตัวที่ผมทำเป็นตัวหนาไว้ ก็คือค่า (D) นั่นเอง สำหรับ solution ที่ผมได้ทดลองทำจะเป็นการ upload file ขึ้น SharePoint สิ่งที่ผมทำมีดังนี้

  1. เอา xml ที่เห็นด้านบน มาตัด เพื่อหาชื่อ file และมาต่อกับ temporary folder เพื่อสามารถเปิดอ่าน file ขึ้นมาได้

//fileInfo คือ

string fileName = fileInfo.Substring(fileInfo.IndexOf(“‘FileName’><value>”) + 18, (fileInfo.IndexOf(“</v”) – fileInfo.IndexOf(“‘FileName’><value>”) – 18));

string fileExtension = fileName.Substring(fileName.IndexOf(“.”));

string currentDate = DateTime.Now.ToString(“yyyyMMddHHmmssff”);

//Rename file name to be unique => ใส่วันที่ และเวลาเพื่อให้ชื่อ file ไม่ซ้ำ
fileName = fileName.Replace(fileExtension, “”) + “-” + currentDate + fileExtension;

 

string filePath = fileInfo.Substring(fileInfo.IndexOf(“‘FilePath'”));
filePath = filePath.Substring(filePath.IndexOf(“‘FilePath’><value>”) + 18, (filePath.IndexOf(“</v”) – filePath.IndexOf(“‘FilePath’><value>”) – 18));

//หา file path มาแล้ว ต่อด้วย .temp เพราะตอน file ถูกใส่ใน temporary folder control จะ add .temp ให้หลังชื่อ file
filePath = tempFilePath + filePath + “.temp”;

2.  ใช้ FileStream class สำหรับอ่าน file ขึ้นมาเป็น stream

FileStream contentStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);

3.  Upload file ขึ้น SharePoint

//Url ที่ใช้ต้องเป็น url ถึงระดับ site ที่ต้องการ เช่น http://portal/sites/TestSite

ClientContext ctx = new ClientContext(sharePointUrl);

Web web = ctx.Web;

FileCreationInformation flciNewFile = new FileCreationInformation();
flciNewFile.ContentStream = contentStream;
flciNewFile.Url = fileName;
flciNewFile.Overwrite = true;

List docs = web.Lists.GetByTitle(libraryName);
Microsoft.SharePoint.Client.File uploadFile = docs.RootFolder.Files.Add(flciNewFile);
ctx.Load(uploadFile);
ctx.ExecuteQuery();

หลังจากสร้างเป็น class เรียบร้อย เราก็สามารถเอา class นี้ไปเรียกใช้ผ่าน SmartObject ได้เป็นอันเสร็จพิธี 🙂  แล้วพบกันใหม่คราวหน้าครับ

อนึ่ง. ได้ทดลองและทดสอบกับ K2 4.6.9 + SharePoint Foundation 2013 ถ้าเอาไปใช้กับ version อื่น โปรดตรวจสอบความถูกต้องก่อนใช้

อสอง. reference link ของ SharePoint upload large file มาจาก https://msdn.microsoft.com/en-us/library/office/dn904536.aspx

[K2 for SharePoint] – Configuration Checklist

สวัสดีครับ ช่วงที่ผ่านมาได้มีโอกาส configure K2 for SharePoint 2013 แบบจริงจัง (คือ ปกติไม่จริงจัง ใช่ไหม = =’) และพบปัญหาในการทำค่อนข้างเยอะ เพราะ step ในการ configure ส่วน SharePoint ที่ต้องทำเยอะจนจำไม่ไหว เลยอยากจด step คร่าวๆ เพื่อเป็นแนวทางสำหรับผู้ที่สนใจ อยากลอง หรือโดนบังคับให้ทำ (ซึ่งคิดว่า กลุ่มหลังสุดน่าจะเยอะกว่า 555) และเผื่อกันลืม (จริงๆ สาเหตุที่เขียนน่าจะเป็นอันหลังนี่แหละ)

 

ต้องขอเกริ่นก่อนว่า (ข้างบนยาวๆ นี่ไม่ใช่รึ??) การ configure K2 for SharePoint 2013 จะต่างกับ K2 for SharePoint 2010 ค่อนข้างเยอะ อย่างแรกคือ ไม่จำเป็นที่จะต้องไปลง program K2 for SharePoint ที่เครื่อง SharePoint อีกต่อไป สิ่งที่ต้องทำก็คือ ลง K2 for SharePoint ที่เครื่อง K2 และไป run โปรแกรม Application Deployment บนเครื่อง SharePoint App อย่างที่สองคือ ไม่ support SharePoint foundation แล้ว (เพราะ Microsoft ไม่ได้เปิดให้ 3rd party tool เข้าไป connect) แต่ถ้าใช้เป็น SharePoint 2010 site บน SharePoint 2013 ก็ยังจะสามารถใช้ feature บางส่วนของ K2 for SharePoint ได้

 

มาเริ่มกันที่ส่วนแรก ก่อนที่จะ configure User ที่จะใช้ run Application Deployment ต้องเตรียม permission ตามด้านล่าง

  • Local Administrator บน SharePoint Server
  • K2 Administrator (ให้สิทธิ์ Admin บน Server Rights ของ K2)
  • Site Collection Administrator บน App Catalog Site Collection
  • db_owner บน database SharePoint_Config
  • SharePoint Shell Access role (grant role SharePoint Shell Access ให้ user ดูวิธีได้ตามนี้ https://technet.microsoft.com/en-us/library/ff607596(v=office.15).aspx)
  • User ที่ใช้ run ต้องไม่เป็น SharePoint Service Account หรือเป็น Application pool account ของ SharePoint site ใดๆ

 

SharePoint Service ที่ต้องใช้สำหรับการทำ Application Deployment

App deployment

  • App Management Service
  • Subscription Setting Service
  • User Profile Service

สำหรับ App Management Service และ Subscription Setting Service สามารถทำตาม step ใน link นี้ได้เลย https://technet.microsoft.com/en-us/library/fp161234(v=office.15).aspx  *บางคนที่คุ้นเคยกับ help ของ Microsoft ปกติจะมีวิธีทำมาให้ 2 แบบคือ ผ่าน UI หรือ command แต่สำหรับ article นี้ ส่วนที่ใช้ power shell command จะต้อง run นะครับ ไม่มี UI มาให้ ดังนั้นห้ามข้าม step ครับ

สิ่งที่จะเป็นคำถามแรกหลังจากเปิดหน้านี้คือ DNS กับ CNAME ถ้าเรามี permission สำหรับสร้าง DNS ก็จะสบายหน่อย แต่ถ้าไม่มีสิ่งที่ทำได้คือ ให้ fix ชื่อ ของ application ที่จะใช้ไว้ใน host file ของ SharePoint server ก่อน เพื่อให้สามารถ configure ได้ ซึ่งสิ่งที่เราต้องรู้ใน step นี้ 2 อย่างคือ domain name และ prefix

Domain name แนะนำให้ใช้ชื่อเดียวกับ domain ที่เราอยู่ ส่วน Prefix จะเป็นอะไรก็ได้ แต่ถ้าให้ดูง่ายก็ควรจะเป็น Apps นำหน้า และใส่ environment ตามหลัง เช่น AppsDev (แต่ถ้าเป็น production อาจจะใช้ Apps เลยก็ได้) ในส่วนนี้ถ้าเราต้องใส่ url ใน host file ไว้ก่อน ให้ใส่เป็น -K2Test ไว้ด้วย เพราะตัว Application Deployment จะพยายาม ping ชื่อ App ที่เป็น -K2Test เพื่อทดสอบว่า DNS set ไว้ถูกต้องหรือไม่ แต่หลังจาก configure เสร็จเรียบร้อยแล้ว ยังไงก็ต้อง set DNS นะครับ เพราะตอนสร้าง App ใช้จริงๆ SharePoint จะสร้างเป็น url Prefix + Generate ID + Domain Name ซึ่งไม่สามารถเดาได้ว่า url จะเป็นชื่ออะไรครับ

Host Fix

ตัวอย่างการ fix ใน host

  สำหรับ User Profile Service สามารถทำตาม step ใน link นี้ https://technet.microsoft.com/en-us/library/ee721049(v=office.15).aspx  *ทำถึง Phase 2 – Create a synchronization connection to a directory service ก็พอ จากนั้นให้ grant permission ให้ user ที่จะเอาไป run Application Deployment เป็น Full Control ใน User Profile Service 

 

Check list

  • ลง K2 for SharePoint บนเครื่อง K2 โดยใช้ K2 service account
  • ตรวจสอบ Service ของ SharePoint ที่เปิดว่า เปิดครบหรือไม่
  • Create app catalog บน SharePoint และ grant Contribute permission ให้ user ที่จะ deploy
  • run Application Deployment ในเครื่อง SharePoint โดย login ไปด้วย user ที่เรา set permission ไว้ด้านบน (ใช้ K2 service account และ grant สิทธิให้ตามด้านบนก็ได้ แต่เหมือนเคยอ่านเจอว่า ควรจะแยกให้เป็น user อีกอันไปเลย) สามารถดู step โดยละเอียดได้ที่นี่ http://help.k2.com/onlinehelp/K2ForSharePoint/ICG/4.6.11/default.htm#Install_Topics/OnPrem/On-Premises_Installation.htm%3FTocPath%3DInstall%7CSharePoint%25202013%2520(On-Prem)%2520Installation%7C_____0
  • สร้าง site ใหม่สำหรับทดสอบ และลองหา K2 for SharePoint app จาก App catalog และกด Add เข้า site

 

หลังจากผ่าน step มามากมาย เราก็จะได้เห็นหน้านี้จนได้ T^T

K2 for SharePoint

 

หวังว่า จะเป็นประโยชน์กับคนที่ต้องทำนะครับ สำหรับวันนี้ขอลาไปก่อนครับ