Slowness Accessing Knowledge Base
We are currently experiencing slow responses when accessing Knowledge Base articles directly and through Elio. Thank you for your patience while we work on resolving the issue.

Microsoft Virtualization Discussions

Get-nanfsexport SecurityRules -expandproperty

JGPSHNTAP
4,117 Views

Guys..

I need a little kick-start here.. I'm struggling with the formatting of embedded objects. 

get-nanfsexport has a property security rules that has your readwrite hosts and root access which is yet another embedded object.    I'm just trying to do something what should be basic but I need a little kickstart

pathname  readwrite  root

So, the output i'm looking for would be osmething like

/vol/vol0    all  10.1.2.1

Hence i'm not that good with -expandproperty and multiple embedded objects...

5 REPLIES 5

billyd
4,073 Views

Would this get you what you are looking for?

foreach ($nfspath in get-nanfsexport){

$customobject = new-object psobject;

$nfs = get-nanfsexport -path $nfspath.ActualPathname | select -ExpandProperty securityrules;

add-member -InputObject $customobject -MemberType NoteProperty -name Path -value $nfspath.Pathname;

add-member -InputObject $customobject -MemberType NoteProperty -name RW -value $nfs.readwrite;

add-member -InputObject $customobject -MemberType NoteProperty -Name Root -value $nfs.root;

$array += $customobject;

}

$array

JGPSHNTAP
4,074 Views

That codes not working, but I think your onto something..

I'm hoping beam or clinton chime in on embedded objects.. I'm going to give this another whirl..

JGPSHNTAP
4,074 Views

I'm making a little bit of headway on this

PS C:\powershell> get-nanfsexport | select -first 1 | Select pathname, @{N="Root";E={($_.securityrules).root}},@{N="r/w";e={($_.securityrules).readwrite}}

Pathname                                Root                                    r/w

--------                                ----                                    ---

/dump                                   {host1, host2}                 all-hosts

But I still need to figure out how to make that embedded object just a string ..

beam
4,074 Views

Part of the challenge is the result object for Get-NaNfsExport can have zero or more security rules--which are unique.  So we can't just flatten out the object, we have to associate the list of rules with the pathname.  The best was I can think of to do this is using foreach blocks:

PS C:\> Get-NaNfsExport | %{ $path = $_.Pathname; $_.SecurityRules | % { New-Object PSObject -Property @{Pathname=$path; Root = $_.Root; ReadWrite=$_.ReadWrite } } }  | ft Root,ReadWrite -GroupBy Pathname

This formats the result in a table containing Root and ReadWrite, and groups them by the Pathname.  You end up with a table like this:

   Pathname: /vol/dt

Root                                                        ReadWrite

----                                                        ---------

                                                            {all-hosts}

   Pathname: /vol/dt/storagedomain

Root                                                        ReadWrite

----                                                        ---------

{10.61.185.111}                                             {10.61.185.111}

   Pathname: /vol/files

Root                                                        ReadWrite

----                                                        ---------

                                                            {all-hosts}

Now, from here we need to figure out a way to turn that into a string that's readable.  I created a quick little GetString function which will turn that object into a string formatted like so: ({Negate}) {Name}:

function GetString {

param([Parameter(ValueFromPipeline=$true)]$obj)

if($obj -eq $null) { return $null }

return "({0}) {1}" -f $(if($obj.Negate) { "-" } else { "+" }), $(if($obj.AllHosts) { "all-hosts" } else {$obj.Name})

}

Now we can change our original command, and get a new table:

PS C:\> Get-NaNfsExport | %{ $path = $_.Pathname; $_.SecurityRules | % { New-Object PSObject -Property @{Pathname=$path; Root = $_.Root | GetString; ReadWrite=$_.ReadWrite | GetString } } }  | ft Root,ReadWrite -GroupBy Pathname

   Pathname: /vol/dt

Root                                                        ReadWrite

----                                                        ---------

                                                            all-hosts

   Pathname: /vol/dt/storagedomain

Root                                                        ReadWrite

----                                                        ---------

10.61.185.111                                           10.61.185.111

   Pathname: /vol/files

Root                                                        ReadWrite

----                                                        ---------

                                                            all-hosts

I hope that helps!

-Steven

billyd
4,074 Views

How about this:

Get-NaNfsExport | select pathname,@{n="RO";e={$_.SecurityRules.ReadOnly -join ','}},@{n="RW";e={$_.SecurityRules.ReadWrite -join ','}},@{n="Root";e={$_.SecurityRules.root -join ','}} | Format-list

I did Format-List for this example but you could Format-Table or export to CSV.  Format-List seems to be a cleaner output than F-T with a long list of IPs but that's probably because I don't know how to expand columns.

OUTPUT:

Pathname : /vol/datastore01

RO       :

RW       : 192.168.102.103,192.168.120.15,192.168.102.105,192.168.120.16,192.168.102.109,192.168.120.18,192.168.102.107,192.168.120.17,192.168.102.7,192.168.99.41,192.168.102.9,192.168.99

           .42,192.168.102.11,192.168.99.43,192.168.102.23,192.168.99.49,192.168.102.25,192.168.99.50,192.168.102.27,192.168.99.51,192.168.102.29,192.168.99.52,192.168.102.13,192.168.99.4

           4,192.168.102.71,192.168.99.77,192.168.102.73,192.168.99.78,192.168.102.75,192.168.99.79,192.168.102.77,192.168.99.80,192.168.102.37,192.168.99.56,192.168.102.15,192.168.99.45,

           192.168.102.17,192.168.99.46,192.168.102.19,192.168.99.47,192.168.102.21,192.168.99.48,192.168.102.31,192.168.99.53,192.168.102.33,192.168.99.54,192.168.102.35,192.168.99.55,17

           2.25.102.79,192.168.99.81,192.168.102.81,192.168.99.82,192.168.102.83,192.168.99.83,192.168.102.85,192.168.99.84,192.168.102.87,192.168.99.85,192.168.102.89,192.168.99.86,172.

           25.102.91,192.168.99.87,192.168.102.93,192.168.99.88,192.168.102.67,192.168.99.73,192.168.102.69,192.168.99.74,192.168.102.95,192.168.99.89,192.168.102.97,192.168.99.90,192.168

           .102.99,192.168.99.91,192.168.102.101,192.168.99.92,192.168.102.39,192.168.99.59,192.168.102.43,192.168.99.61,192.168.102.41,192.168.99.60,192.168.102.47,192.168.99.63,192.168.

           102.49,192.168.99.64,192.168.102.51,192.168.99.65,192.168.102.53,192.168.99.66,192.168.102.45,192.168.99.62,192.168.102.55,192.168.99.67,192.168.102.57,192.168.99.68,192.168.10

           2.59,192.168.99.69,192.168.102.61,192.168.99.70,192.168.102.63,192.168.99.71,192.168.102.65,192.168.99.72

Root     : 192.168.102.103,192.168.120.15,192.168.102.105,192.168.120.16,192.168.102.109,192.168.120.18,192.168.102.107,192.168.120.17,192.168.102.7,192.168.99.41,192.168.102.9,192.168.99

           .42,192.168.102.11,192.168.99.43,192.168.102.23,192.168.99.49,192.168.102.25,192.168.99.50,192.168.102.27,192.168.99.51,192.168.102.29,192.168.99.52,192.168.102.13,192.168.99.4

           4,192.168.102.71,192.168.99.77,192.168.102.73,192.168.99.78,192.168.102.75,192.168.99.79,192.168.102.77,192.168.99.80,192.168.102.37,192.168.99.56,192.168.102.15,192.168.99.45,

           192.168.102.17,192.168.99.46,192.168.102.19,192.168.99.47,192.168.102.21,192.168.99.48,192.168.102.31,192.168.99.53,192.168.102.33,192.168.99.54,192.168.102.35,192.168.99.55,17

           2.25.102.79,192.168.99.81,192.168.102.81,192.168.99.82,192.168.102.83,192.168.99.83,192.168.102.85,192.168.99.84,192.168.102.87,192.168.99.85,192.168.102.89,192.168.99.86,172.

           25.102.91,192.168.99.87,192.168.102.93,192.168.99.88,192.168.102.67,192.168.99.73,192.168.102.69,192.168.99.74,192.168.102.95,192.168.99.89,192.168.102.97,192.168.99.90,192.168

           .102.99,192.168.99.91,192.168.102.101,192.168.99.92,192.168.102.39,192.168.99.59,192.168.102.43,192.168.99.61,192.168.102.41,192.168.99.60,192.168.102.47,192.168.99.63,192.168.

           102.49,192.168.99.64,192.168.102.51,192.168.99.65,192.168.102.53,192.168.99.66,192.168.102.45,192.168.99.62,192.168.102.55,192.168.99.67,192.168.102.57,192.168.99.68,192.168.10

           2.59,192.168.99.69,192.168.102.61,192.168.99.70,192.168.102.63,192.168.99.71,192.168.102.65,192.168.99.72

Public