繁体   English   中英

Powershell:如何将ADUser转换为IdentityReference?

[英]Powershell: How do I convert ADUser to IdentityReference?

我试图将所有者设置在一个文件夹上,但我一直遇到问题。 这是我当前的脚本。 我正在尝试解析共享下的所有文件夹,并根据文件夹名称将文件夹的所有者设置为相应的ADUser。 文件夹名称是SAMAccountNames。

Import-Module ActiveDirectory

$path = Get-ChildItem F:\AppData\*\ | ?{ $_.PSIsContainer }
ForEach ($folder in $path) {
    $ACL = get-acl $folder
    $username = $folder.Name
    $userobject = Get-ADUser $username
    $ACL.SetOwner($userobject)
    Set-Acl $folder.FullName $ACL
    Write-Host $username
}

我在这里得到的错误是:

无法将参数“ Identity”与“ SetOwner”的值(在此处插入专有名称)转换为System.Security.Principal.IdentityReference类型

有什么更好的方法?

假设这是一个域,则可以使用用户的samaccountname创建将与.SetOwner()方法一起使用的System.Security.Principal.NTAccount对象。

$userobject = Get-ADUser $folder.Name
$ACL.SetOwner(New-Object System.Security.Principal.NTAccount("bagel", $userobject.samaccountname))

如您发现的那样,用户可能不存在,因此您需要考虑这一点,以减轻将来的错误。 一种简单的方法是检查Get-Aduser的结果

$userobject = Get-ADUser $folder.Name -ErrorAction SilentlyContinue
if($userobject){
    # Found it. Do stuff
} else {
    # Could not find it. Do different stuff
}

注意 如果由于某种原因使用户失败,则将触发其他事件。 DC不可用,找不到用户,权限错误等。

如果您想要更多控制权,则可以尝试try / catch查找特定错误等。

try{
    Get-ADUser "cantpossiblyexist"
} catch [Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException]{
    "No. Mr. User not here"
}

感谢马特在这方面的一些帮助,但是答案却有所不同。 这是最终的工作产品。

重要说明:该脚本必须从另一台计算机(最好是Windows 2012或更高版本)上运行,否则您将收到一条错误消息:“不允许安全标识符作为该对象的所有者。”

$path = Get-ChildItem \\COMPUTERNAME\SHARENAME\* | ?{ $_.PSIsContainer }
ForEach ($folder in $path) {
    $ACL = (get-item $folder.FullName).GetAccessControl('Owner')
    $username = $folder.Name
    $userobject = New-Object System.Security.Principal.NTAccount("NTDOMAIN", $username)
    $AccessRule1 = New-Object  system.security.accesscontrol.filesystemaccessrule("CREATOR OWNER","FullControl","ContainerInherit, ObjectInherit","InheritOnly","Allow")
    $AccessRule2 = New-Object  system.security.accesscontrol.filesystemaccessrule("Domain Admins","FullControl","ContainerInherit, ObjectInherit","InheritOnly","Allow")
    $AccessRule3 = New-Object  system.security.accesscontrol.filesystemaccessrule($userobject,"FullControl","ContainerInherit, ObjectInherit","InheritOnly","Allow")

    try {
        $ACL.SetOwner($userobject)
        $ACL.AddAccessRule($AccessRule1)
        $ACL.AddAccessRule($AccessRule2)
        $ACL.AddAccessRule($AccessRule3)
        Set-Acl $folder.FullName $ACL
        Write-Host $username
    }
    catch {
        #Delete folder if user is not found.
        Remove-Item $folder -recurse -force
        Write-Host $username "CANNOT BE FOUND"
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM