GET-ACL 没有域路径的文件所有者

GET-ACL file owner without domain path

我需要一种使用 GET-ACL 提取文件所有者的快速方法,并使用用户名而不是域路径创建变量。尝试简单地替换域没有用。

$user = GET-ACL $lastImage.FullName | Select Owner
$user = $user.Replace('ANT\', '')

提供此错误:

Method invocation failed because [Selected.System.Security.AccessControl.FileSecurity] does not contain a method named 'Replace'.
At line:1 char:1
+ $user = $user.Replace('ANT\', '')

我知道替换字符串是正确的,因为它有效:

$user = 'ANT\username'
$user = $user.Replace('ANT\', '')

我也尝试过使用 split 但没有成功:

$user = GET-ACL | Select Owner
$user.Split('\')[1]

还有这个,虽然有效,但输出包含不需要的 headers:

$user = Get-ChildItem $lastImage.FullName | select @{Name='Owner';E=
{(($_.GetAccessControl().Owner.Split('\'))[1])}}

有人知道使用 GET-ACL 将用户名作为变量的简单方法吗?如果没有,我应该使用更好的 cmdlet 吗?

改变这个:

$user = GET-ACL $lastImage.FullName | Select Owner

对此:

$user = GET-ACL $lastImage.FullName | Select -ExpandProperty Owner

解释:

您正在尝试替换 PSCustomObject 类型而不是字符串,.Replace() 方法是一个字符串方法,这就是您收到错误消息 does not contain a method named 'Replace'.[=18 的原因=]

当您添加 -ExpandProperty 时,您将获得字符串值,然后替换方法将起作用。

参见:-ExpandProperty MSDN Blogs

的进一步解释

$user.Replace('ANT\', '') 更改为 $user.Owner.Replace('ANT\', '')。由于您正在做的是引用对象的所有者 属性。然后,您可以从第一行中删除 | Select Owner,因为不需要它。

所以如下:

$user = Get-Acl $lastImage.FullName
$user = $user.Owner.Replace('ANT\', '')