【问题标题】:Powershell: How do you set the Read/Write Service Principal Name AD Permissions?Powershell:如何设置读/写服务主体名称 AD 权限?
【发布时间】:2010-11-11 16:35:17
【问题描述】:

在 Powershell 中,如何设置 Read/Write Service Principal Name AD 用户权限?

通常在我的构建过程中,我使用 ADSIedit 导航到该对象,然后浏览所有安全选项卡以在以下位置打勾:

  • 读取服务主体名称
  • 写入服务主体名称

但是通过 ADSIedit 导航可能需要很长时间,所以我正在尝试编写该过程的脚本。如果我与创建的新用户绑定了 PowerShell LDAP,如何使用 PowerShell 为该用户帐户设置这两个属性?

以下是我的安装脚本可能相关部分的代码-sn-p:

$strDomain = "dc=my,dc=com"
$objDomain = [ADSI] "LDAP://" + strDomain 
$strSCCMSQLPW = Read-Host -assecurestring "Please enter a password for the " + $strSCCMSQL + " account: "
New-ADUser -SamAccountName $strSCCMSQL + -Name $strSCCMSQL -AccountPassword $strSCCMSQLPW -Enabled $true -Path $strUsersOU + "," + $strDomain -PasswordNeverExpires $true

【问题讨论】:

    标签: powershell active-directory


    【解决方案1】:

    您需要在目标对象的 ACL 中添加一个 ActiveDirectoryAccessRule 对象。对于设置属性特定的权限,诀窍是将 schemaIDGUID 传递给属性。所以首先我们需要从 Service-Principal-Name 模式条目中找到 schemaIDGUID。在示例代码中,我静态引用了 Service-Principal-Name,最好是搜索 ldapDisplayname 以找到条目,但我相信您可以解决这个问题。无论如何,这段代码应该可以完成这项工作:

    Function Set-SpnPermission {
        param(
            [adsi]$TargetObject,
            [Security.Principal.IdentityReference]$Identity,
            [switch]$Write,
            [switch]$Read
        )
        if(!$write -and !$read){
            throw "Missing either -read or -write"
        }
        $rootDSE = [adsi]"LDAP://RootDSE"
        $schemaDN = $rootDSE.psbase.properties["schemaNamingContext"][0]
        $spnDN = "LDAP://CN=Service-Principal-Name,$schemaDN"
        $spnEntry = [adsi]$spnDN
        $guidArg=@("")
        $guidArg[0]=$spnEntry.psbase.Properties["schemaIDGUID"][0]
        $spnSecGuid = new-object GUID $guidArg
    
        if($read ){$adRight=[DirectoryServices.ActiveDirectoryRights]"ReadProperty" }
        if($write){$adRight=[DirectoryServices.ActiveDirectoryRights]"WriteProperty"}
        if($write -and $read){$adRight=[DirectoryServices.ActiveDirectoryRights]"readproperty,writeproperty"}
        $accessRuleArgs = $identity,$adRight,"Allow",$spnSecGuid,"None"
        $spnAce = new-object DirectoryServices.ActiveDirectoryAccessRule $accessRuleArgs
        $TargetObject.psbase.ObjectSecurity.AddAccessRule($spnAce)
        $TargetObject.psbase.CommitChanges()    
        return $spnAce
    }
    

    调用函数的示例行...

    $TargetObject = "LDAP://CN=User,OU=My User Org,DC=domain,DC=net"
    $Identity = [security.principal.ntaccount]"domain\user"
    
    Set-SpnPermission -TargetObject $TargetObject -Identity $Identity -write -read
    

    【讨论】:

    • 感谢 Cosmos 的帖子。我将验证它是否有效,然后标记。我感谢迟到的接送!大声笑。
    【解决方案2】:

    这是一个使用 Quest 设置服务主体名称属性权限的示例。

    首先,添加任务:

    Add-PSSnapin Quest.ActiveRoles.ADManagement;
    

    设置权限(使用 Add-QADPermission):

    Get-QADUser UserName | Add-QADPermission -Account 'SELF' -Rights 'ReadProperty,WriteProperty' -Property 'servicePrincipalName' -ApplyTo 'ThisObjectOnly';
    

    【讨论】:

      【解决方案3】:

      您可以使用Quest AD cmdlets。它使 PowerShell 中的 AD 权限变得非常简单。

      阅读此blog,了解有关如何添加 AD 权限甚至复制 AD 权限的一些示例。

      只需查找Add-QADPermission,它就可以完成您的工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-24
        • 2016-06-08
        • 1970-01-01
        • 2020-12-27
        相关资源
        最近更新 更多