Sharepoint - 无法将密封属性设置为False

时间:2014-05-23 15:34:24

标签: powershell sharepoint-2010

我正在尝试从Sharepoint 2010文档库中删除密封字段。有问题的字段最初是默认的Sharepoint Title字段,此字段已被重命名。我在Sharepoint Management Shell中,但是当我尝试将Sealed属性更新为false时,我收到以下错误消息:

  

异常设置“密封”:“由于对象的当前状态,操作无效。”

请注意,我能够使用相同的方法在同一列表中成功解除其他字段。

这是我正在使用的完整命令集:

$web = Get-SPweb("myurl")
$list = $web.Lists["mylist"]
$field = $list.Fields["column to delete"]
$field.AllowDeletion = $true
$field.Sealed = $false -->Here's where I get the error

如果我能够更新Sealed属性,我会继续以下内容:

$field.Delete()
$list.Update()
$web.Dispose()

为了更新Sealed,是否还需要更改其他任何属性? Title字段是否受到唯一保护?

4 个答案:

答案 0 :(得分:0)

以下是关于密封目的的摘录:

有时,您希望确保有人无法通过Windows SharePoint Services用户界面进入并更改您的内容类型。如果管理员要删除或重命名内容类型中的列,则可能会导致各种问题,因为可能会或可能不会将这些问题归结为子类型。您可能还希望确保仅使用功能和CAML创建/修改内容类型。要解决此问题,可以将内容类型标记为已密封,并且只能通过对象模型将其标记为已密封。这可以防止通过用户界面对内容类型进行任何随意更改。

http://www.dotnetmafia.com/blogs/dotnettipoftheday/archive/2009/03/11/how-to-seal-a-content-type.aspx

enter link description here

答案 1 :(得分:0)

我用这段代码解决了这类问题(我们直接更新字段的xml架构):

$web = Get-SPWeb http://my-web-url
$list = $web.Lists["myList"]
$field = $list.Fields.GetFieldByInternalName("myField")
$fxml = [xml]$field.SchemaXml
$fxml.Field.Sealed = "FALSE"
$field.SchemaXml = $fxml.InnerXml
$field.Update();
$web = Get-SPWeb http://my-web-url
$list = $web.Lists["myList"]
$field = $list.Fields.GetFieldByInternalName("myField")
$field.Sealed = $false;
$field.Update();

也许在您的情况下,您也应该更新网站字段。

答案 2 :(得分:0)

我可以通过这种方法解决此问题:

  1. 禁用内容类型。
  2. 通过powershell更新Sealed属性。
  3. 启用内容类型。

答案 3 :(得分:-2)

此脚本可以帮助您更改密封内容类型的字段:

param([string]$webUrl="http://spdev", [string]$contentTypeName="myContenttype", [string]$fieldName="myTitle", [boolean]$required=$true)
if ((Get-PSSnapin "Microsoft.SharePoint.PowerShell" -ErrorAction SilentlyContinue) -eq $null) {
    Add-PSSnapin Microsoft.SharePoint.PowerShell
}
clear
$web = Get-SPWeb $webUrl
$ct = $web.ContentTypes[$contentTypeName];
$oldSealedValue = $ct.Sealed;
Write-Host "content type Sealed Property $($ct.Sealed)"
if($ct.Sealed)
{
    $ct.Sealed = $false;
}
$field = $ct.FieldLinks[$fieldName];
$field.Required = $required;
Write-Host "set field $($fieldName) Required $($ct.Required)"
 
if($oldSealedValue)
{
    $ct.Sealed = $true;
}
$ct.Update($true);
$web.Update();
$web.Dispose();