در سازمانهای بزرگ و هلدینگهایی که هسته مکاتبات و ثبت اطلاعات خود را بر بستر مایکروسافت شیرپوینت (SharePoint Server 2016 / 2019 / Subscription Edition) مستقر کردهاند، فرمهای پیشفرض شیرپوینت پاسخگوی الزامات امنیتی و فرایندی نیستند. نیاز به پنهانسازی ستونهای حقوقی و مالی از پرسنل عادی، نمایش تبهای مرحلهای بر اساس پیشرفت وضعیت درخواست، و اعتبارسنجی مقادیر فیلدها بر مبنای سایر لیستها، مدیران سیستم را ناچار به استفاده از افزونههای فرمساز میسازد.
مجموعه ابزارهای KWizCom Forms Enterprise Suite استانداردترین راهکار توسعه فرمها در شیرپوینت On-Premises است؛ زیرا بر خلاف فرمسازهای سنگین که ساختار صفحات شیرپوینت را به کلی بازنویسی میکنند، KWizCom به عنوان یک لایه منطقی استاندارد (Extension Framework) روی فرمهای بومی NewForm.aspx، EditForm.aspx و DispForm.aspx سوار میشود. این معماری تضمین میکند که هیچ خللی در خزشگر موتور جستجو (Search Crawler) یا سقف آستانه نمایش لیستها (List View Threshold) ایجاد نگردد. در این مقاله تخصصی، نحوه پیادهسازی کنترل دسترسی فیلدی، تببندی تعاملی و استقرار آفلاین در شبکه ایزوله بررسی میشود.
۱. معماری لایهای KWizCom Forms و تفاوت آن با ابزارهای بازنویسی فرم #
بسیاری از سازمانها تجربه تلخی از بهکارگیری فرمسازهایی دارند که تمام کدهای صفحه را به یک iframe یا اسکریپت جاوااسکریپت غیرخوانا تبدیل میکنند. شکل زیر نحوه تزریق لایهای KWizCom را در مقایسه با سایر ابزارها نشان میدهد:
┌────────────────────────────────────────────────────────┐
│ درخواست کاربر / مرورگر پرسنل │
└──────────────────────────┬─────────────────────────────┘
│
▼
┌────────────────────────────────────────────────────────┐
│ موتور ارزیابی قوانین KWizCom (Client & Server) │
│ - بررسی عضویت کاربر در گروههای امنیتی AD / SP │
│ - ارزیابی وضعیت گردشکار و شرایط مقادیر فیلدها │
│ - اعمال قوانین مخفیسازی / غیرفعالسازی ستونها │
└──────────────────────────┬─────────────────────────────┘
│
▼
┌────────────────────────────────────────────────────────┐
│ صفحه فرم استاندارد شیرپوینت (New / Edit Form) │
│ - تولید ساختار تبها (Tabs & Accordion Containers) │
│ - اتصال به فیلترهای آبشاری (Cascading Lookups) │
│ - اتصال مستقیم به دیتابیس بدون دستکاری سورس صفحه │
└────────────────────────────────────────────────────────┘
۲. جدول مقایسه قابلیتهای امنیتی ستونها در KWizCom و شیرپوینت خام #
شیرپوینت در حالت استاندارد هیچ مکانیزمی برای تفکیک دسترسی ستونها (Column-Level Security) ندارد. جدول زیر نشان میدهد KWizCom چگونه این شکاف امنیتی را پر میکند:
| سناریوی عملیاتی سازمان | شیرپوینت خام (Out-of-the-Box) | شیرپوینت مجهز به KWizCom Forms Suite |
|---|---|---|
| مخفیسازی فیلدهای مالی از کارشناس | غیرممکن (همه ستونها برای افراد دارای دسترسی خواندن/نوشتن باز است) | اعمال مجوز ستونی بر اساس گروه کاربری یا مقدار فیلد وضعیت |
| فیلدهای فقطخواندنی (Read-Only) شرطی | فقط با کدنویسی پیچیده JS Link / SPFx | تعریف قوانین بصری No-Code برای فقطخواندنی شدن ستون |
| تببندی و گروهبندی فرمهای طولانی | فرمهای بیپایان با اسکرول عمودی بسیار زیاد | دستهبندی در تبهای افقی، عمودی، یا آکاردئونی واکنشگرا |
| فیلترهای آبشاری (استان -> شهر -> شعبه) | نیازمند کدهای غیرپایدار REST و جاوااسکریپت | ماژول Cascading Lookup با کش سمت کلاینت و سرعت بالا |
| عبور از سقف ۵۰۰۰ آیتم (List View Threshold) | خطا در زمان باز شدن فرم و کرش کوئریها | صفحهبندی هوشمند و اتصال به ایندکسهای کامپایلشده |
| پشتیبانی از شبکههای بدون اینترنت (Air-Gapped) | نیازمند اتصال CDN در بسیاری از فریمورکهای فرانتاند | ۱۰۰٪ فایلهای JS/CSS به صورت محلی در Hive 15/16 ذخیره هستند |
۳. پیکربندی قوانین امنیتی فیلدها (Field-Level Permissions) #
یکی از پرکاربردترین سناریوها، مخفیسازی ستون "نظر مدیرعامل" و "سقف اعتبار مصوب" در فرم درخواست وام است. در KWizCom، این قوانین از طریق فایل XML یا کنسول وب ذخیره میشوند:
<!-- نمونه پیکربندی قانون دسترسی فیلد بر اساس گروه امنیتی -->
<FieldPermissionRule FieldName="ApprovedCreditLimit" TargetState="Hidden">
<Conditions Operator="And">
<Condition Field="RequestStatus" Operator="Equal" Value="Draft" />
<UserCondition Type="NotInGroup" TargetGroup="FinancialManagers" />
</Conditions>
</FieldPermissionRule>
<FieldPermissionRule FieldName="ManagerComments" TargetState="ReadOnly">
<Conditions Operator="Or">
<Condition Field="RequestStatus" Operator="Equal" Value="Approved" />
<Condition Field="RequestStatus" Operator="Equal" Value="Rejected" />
</Conditions>
</FieldPermissionRule>
این قوانین علاوه بر سمت مرورگر، در زمان فراخوانیهای ذخیرهسازی داده اعتبارسنجی میشوند تا پرسنل آشنا به ابزارهای Inspect نتوانند با تغییر DOM مقادیر غیرمجاز ثبت کنند.
۴. استقرار خودکار پکیج WSP در سراسر مزرعه با PowerShell #
برای استقرار پکیج در مزارع چندسروری شامل سرورهای Front-End و Application بدون نیاز به اینترنت، اسکریپت زیر در محیط PowerShell اجرا میشود:
<#
.SYNOPSIS
Deploy KWizCom Enterprise Forms Suite WSP to SharePoint Farm
#>
$ErrorActionPreference = "Stop"
Add-PSSnapin Microsoft.SharePoint.PowerShell -ErrorAction SilentlyContinue
Write-Host "[DEPLOY] Checking KWizCom Solution Packages..." -ForegroundColor Cyan
$wspDirectory = "C:\Installers\KWizCom"
$solutions = @(
"KWizCom.Forms.Foundation.wsp",
"KWizCom.Forms.FieldPermissions.wsp",
"KWizCom.Forms.CascadingLookups.wsp"
)
foreach ($wsp in $solutions) {
$fullPath = Join-Path $wspDirectory $wsp
if (-not (Test-Path $fullPath)) {
throw "[FATAL] Package $wsp not found at $fullPath"
}
$existing = Get-SPSolution -Identity $wsp -ErrorAction SilentlyContinue
if (-not $existing) {
Write-Host "[ADD] Adding $wsp to Farm Solution Store..." -ForegroundColor Yellow
Add-SPSolution -LiteralPath $fullPath
}
Write-Host "[INSTALL] Deploying $wsp globally with Full-Trust..." -ForegroundColor Green
Install-SPSolution -Identity $wsp -GACDeployment -AllWebApplications -Force
}
# Restart Web Applications Application Pools
Write-Host "[POOLS] Recycling IIS Worker Processes..." -ForegroundColor Cyan
Invoke-Command -ScriptBlock {
Get-ChildItem "IIS:\AppPools" | Where-Object { $_.Name -like "SharePoint*" } | Restart-WebAppPool
}
Write-Host "[SUCCESS] KWizCom Suite successfully deployed and active farm-wide." -ForegroundColor Green
۵. بهینهسازی فرمهای حجیم و عبور از خطای سقف ۵۰۰۰ آیتم #
هنگامی که لیستهای مرجع در فرمها به بیش از ۵,۰۰۰ رکورد میرسند، فراخوانیهای عادی در شیرپوینت با خطای List View Threshold Exceeded متوقف میشوند. برای جلوگیری از این بحران:
-
1
ایندکسگذاری فیلدهای والد در Cascading Lookup: در لیستهای مرجع، تمام فیلدهایی که در شروط برابری شرکت دارند، باید حتماً در بخش Indexed Columns لیست شیرپوینت ثبت گردند.
-
2
فعالسازی کشینگ سمت سرور KWizCom: در تنظیمات عمومی مزرعه، گزینه
Enable Cache for Lookupsفعال شود تا مقادیر تکراری جداول پایه به جای دیتابیس از حافظه رم سرویس فرانتاند خوانده شوند. -
3
محدودسازی نتایج جستجو به ۲۰ رکورد: فیلد آبشاری را به حالت جستجوی حین تایپ (Auto-Complete Search) تغییر دهید تا از لود شدن هزاران گزینه درون المنت
جلوگیری شود.
۶. فعالسازی دائمی و چکلیست پایداری در شبکه ایزوله #
در سناریوهای Air-Gapped که دسترسی به وب مسدود است، لایسنس ماژولهای KWizCom بر اساس کد هش اختصاصی فارم (Farm ID) ثبت میگردد. با تزریق کلید لایسنس دائمی سازمانی از طریق Central Administration، تمامی وباپلیکیشنها و Site Collectionهای ایجاد شده بدون انقضای زمانی و بدون تماس با سرورهای خارجی فعال باقی خواهند ماند.


