Effective December 3, NetApp adopts Microsoft’s Business-to-Customer (B2C) identity management to simplify and provide secure access to NetApp resources.
For accounts that did not pre-register (prior to Dec 3), access to your NetApp data may take up to 1 hour as your legacy NSS ID is synchronized to the new B2C identity.
To learn more, read the FAQ and watch the video.
Need assistance? Complete this form and select “Registration Issue” as the Feedback Category.

Microsoft Virtualization Discussions

Get-nanfsexport SecurityRules -expandproperty

JGPSHNTAP

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

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

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..

billyd

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

JGPSHNTAP

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

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

Announcements
NetApp on Discord Image

We're on Discord, are you?

Live Chat, Watch Parties, and More!

Explore Banner

Meet Explore, NetApp’s digital sales platform

Engage digitally throughout the sales process, from product discovery to configuration, and handle all your post-purchase needs.

NetApp Insights to Action
I2A Banner
Public