0

是否可以在不使用 -expandproperty 角色的情况下过滤“角色”属性?第一组语句向我展示了我需要什么,除了我无法过滤 Roles -eq "db_owner" 和 users -ne "user3"

#import-module dbatools
$servers = server1,server2
Get-DbaDatabase -SqlInstance $servers -Status Normal | Select SQLInstance,  Name, Owner,Roles, Users 

Results:
SqlInstance : server1
Name        : testdb
Owner       : sa
Roles       : {db_accessadmin, db_backupoperator, db_datareader, db_datawriter, db_ddladmin, db_denydatareader, db_denydatawriter, 
              db_owner, db_securityadmin, public}
Users       : {user1,user2,user3}

如果我运行另一个语句 Get-DbaDatabase -SqlInstance $servers -Status Normal | select -expandproperty Roles| Where Name -eq 'db_owner',db_owner 的属性现在称为“名称”,它将返回“角色”-eq db_owner 的结果。

但是,它现在缺少我在第一个语句中需要的其他属性。我是否必须使用数组来存储每个语句中的值,然后将结果连接在一起,或者是否有另一种方法来过滤“角色”中的属性值?

“角色”名称 MemberType 定义的属性


角色属性 Microsoft.SqlServer.Management.Smo.DatabaseRoleCollection 角色 {get;}

IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True False PSCustomObject System.Object

4

2 回答 2

1

你会反对使用ForEach-Object吗?

下面的脚本应该返回您需要的信息。然后,您可以根据需要进一步过滤这些结果。

Get-DbaDatabase -SqlInstance $servers -Status Normal | ForEach-Object -Process {
    [PSCustomObject]@{
        SqlInstance = $_.SqlInstance
        Name = $_.Name
        Owner = $_.Owner
        Roles = $_.Roles | Where-Object Name -eq 'db_owner'
        Users = $_.Users | Where-Object Name -ne 'user3'
    }
}
于 2020-05-13T08:47:53.390 回答
0
$servers = server1,server2
Get-DbaDatabase -SqlInstance $servers -Status Normal | Select SQLInstance,  Name, Owner,Roles, Users | Where-Object { (@($_.Roles)) -contains 'db_owner' }

假设 Roles 属性返回一个基本数组类型(我无法检查,因为我没有可用的 atm 环境),您可以使用 -contains 运算符来查看数组中是否包含字符串值。

如果 Roles 属性是 base-Collection 类型(您可以使用 .GetType() 进行检查),则可以通过将集合包装在数组表示法中来显式地将 Collections 转换为 Arrays:...| Where-Object { (@($_.Roles)) -contains 'db_owner' }

于 2020-04-01T20:01:45.443 回答