[英]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.