PowerShell साझा फ़ोल्डर की सूची प्राप्त करें


19

मैं उन फ़ोल्डरों की एक सूची प्राप्त करने की कोशिश कर रहा हूं जो एक फ़ाइल साझा पर साझा की जाती हैं। फिलहाल मेरे पास दो परीक्षण फ़ोल्डर हैं:

\\MYPC\Test1

\\MYPC\Test2

इस समय मेरे पास यह कोड है:

$FileServer = Read-Host "Enter file server to search"
$FolderList = Get-ChildItem -Path $FileServer

Write-Host $FolderList

लेकिन यह "पथ नहीं पा सकता" के साथ आता है। मैं \\Server\Shareनिर्देशिका के रूप में यह कैसे कर सकता हूं, इसके उदाहरण देख सकते हैं , लेकिन क्या सिर्फ खोज करना संभव है \\Server?

जवाबों:


24

इसे इस्तेमाल करे:

get-WmiObject -class Win32_Share -computer dc1.krypted.com

Ref: सूची शेयरों में विंडोज w / PowerShell


5
इसके लिए गंतव्य मशीन पर WMI अधिकारों की आवश्यकता होगी, जो विशेष रूप से पोर्टेबल समाधान नहीं है।
मार्क हेंडरसन

3
साथ ही, इसमें RPC संचार की आवश्यकता होगी, जो कि सामान्य SMB की अनुमति होने पर भी कई कॉन्फ़िगरेशन में फ़ायरवॉल होने की संभावना है। बेशक, net viewछिपे हुए शेयर वापस नहीं करेंगे।
पर्यायवाची- dj

14

कमांड लाइन से दूर से शेयर की गणना करने का केवल एक ही तरीका है जो मुझे पता है, और वह है net view:

C:\Users\mark.henderson>net view \\enetsqnap01
Shared resources at \\enetsqnap01



Share name             Type  Used as  Comment

-------------------------------------------------------------------------------
Backups                Disk
CallRecordings         Disk
Download               Disk           System default share
home                   Disk           Home
homes                  Disk           System default share
Installs               Disk
Justin                 Disk           Copy of files from Justin laptop
michael                Disk
Multimedia             Disk           System default share
Network Recycle Bin 1  Disk           [RAID5 Disk Volume: Drive 1 2 3 4]
Public                 Disk           System default share
Qsync                  Disk           Qsync
Recordings             Disk           System default share
Sales                  Disk           Sales Documents
SalesMechanix          Disk
Server2012             Disk           Windows Server 2012 Install Media
Usb                    Disk           System default share
VMWareTemplates        Disk
Web                    Disk           System default share
The command completed successfully.

यह विशेष रूप से अपने आप में पार्स करने योग्य नहीं है, लेकिन, आप लाइन द्वारा डेटा लाइन को संसाधित करने के लिए इसे एक सरणी में फेंक सकते हैं:

$sharedFolders = (NET.EXE VIEW \\enetsqnap01) 

अब आपके पास एक सरणी है, और $sharedFolders[7]आपके पास शुरू होने पर आपके शेयर हैं। आप तब splitकिसी दोहरे स्थान की तरह कुछ कर सकते हैं - एक शेयर नाम में ही प्रकट होने की संभावना नहीं है, और तब तक काम करना चाहिए जब तक कि आपका शेयर नाम बहुत लंबा न हो, केवल शेयर नाम और प्रकार के क्षेत्र के बीच एक ही स्थान छोड़कर:

$sharedFolders[7].split('  ')[0]
Backups

आप इन्हें ForEach और कुछ सशर्त तर्क का उपयोग करके संसाधित कर सकते हैं। यह सही नहीं होगा, लेकिन यह ज्यादातर उपयोग के मामलों के लिए काम करना चाहिए।

संक्षिप्तता के लिए, केवल फ़ाइल नाम को कंसोल पर आउटपुट करने के लिए:

(net view \\enetsqnap01) | % { if($_.IndexOf(' Disk ') -gt 0){ $_.Split('  ')[0] } }

FYI करें: मैंने कॉल को लपेटने और अर्ध-बुद्धिमान तरीके से पाठ आउटपुट को तोड़ने के लिए एक सहायक फ़ंक्शन जोड़ा ... उम्मीद है कि यह समझ में आता है / कुछ लोगों की मदद करता है।
जॉनब्लेवन

1
@ जॉनलवन मैं इसे यहाँ नहीं देखता। शायद एडिट रिजेक्ट हो गया? यदि आप इसे फिर से जमा करते हैं तो मैं देखूंगा कि क्या मैं समय में इसकी समीक्षा कर सकता हूं इससे पहले कि कोई और इसे प्राप्त कर ले।
मार्क हेंडरसन

साभार @ मर्क हेंडरसन समीक्षा नोटों ( superuser.com/review/suggested-edits/535793 ) से ऐसा लगता है कि लोग मुझे एक अलग उत्तर में अपना कोड पोस्ट करना पसंद करेंगे, इसलिए मैंने यहाँ पोस्ट किया है: superuser.com/a/1079174/150000 । आशा है कि यह दूसरों के लिए उपयोगी है। आपके समाधान के लिए फिर से धन्यवाद।
जॉनब्लेवन

8

यदि आप स्थानीय मशीन के शेयरों को ढूंढना चाहते हैं, तो आप कर सकते हैं Get-SmbShare:

> Get-SmbShare

Name                          ScopeName                     Path                          Description
----                          ---------                     ----                          -----------
ADMIN$                        *                             C:\WINDOWS                    Remote Admin
C$                            *                             C:\                           Default share

3

मार्क हेंडरसन के उत्तर पर विस्तार :

$Servers = ( Get-ADComputer -Filter { DNSHostName -Like '*' }  | Select -Expand Name )
foreach ($Server in $Servers)
{
    (net view $Server) | % { if($_.IndexOf(' Disk ') -gt 0){ $_.Split('      ')[0] } } | out-file C:\file_shares\$Server.txt
}

2
क्या आप बता सकते हैं कि आपके विस्तार क्या हैं?
बर्टिब

3

उसके हल के लिए मार्क हेंडरसन को धन्यवाद । मैंने इस फ़ंक्शन कॉल को अधिक PowerShell अनुकूल बनाने में मदद करने के लिए एक आवरण फ़ंक्शन जोड़ा है। मैंने डेटा को तोड़ने के लिए एक अलग दृष्टिकोण का उपयोग किया है (अधिक जटिल, बेहतर नहीं); जिसे वरीयता के आधार पर आसानी से बंद किया जा सकता है।

clear-host
function Get-SharedFolder {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
        [string]$ComputerName 
        ,
        [Parameter(Mandatory = $false)]
        [switch]$GetItem
        ,
        [Parameter(Mandatory = $false)]
        [string[]]$ColumnHeadings = @('Share name','Type','Used as','Comment')  #I suspect these differ depending on OS language?  Therefore made customisable
        ,
        [Parameter(Mandatory = $false)]
        [string]$ShareName = 'Share name' #tell us which of the properties relates to the share name
        #,
        #[Parameter(Mandatory = $false)]
        #[string[]]$Types = @('Disk') # again, likely differs with language.  Also there may be other types to include?
    )
    begin {
        [psobject[]]$Splitter = $ColumnHeadings | %{
            $ColumnHeading = $_
            $obj = new-object -TypeName PSObject -Property @{
                Name = $ColumnHeading
                StartIndex = 0
                Length = 0
            }
            $obj | Add-Member -Name Initialise -MemberType ScriptMethod {
                param([string]$header)
                process {
                    $_.StartIndex = $header.indexOf($_.Name)
                    $_.Length = ($header -replace ".*($($_.Name)\s*).*",'$1').Length
                }
            }
            $obj | Add-Member -Name GetValue -MemberType ScriptMethod {
                param([string]$line)
                process {
                    $line -replace ".{$($_.StartIndex)}(.{$($_.Length)}).*",'$1'
                }
            }
            $obj | Add-Member -Name Process -MemberType ScriptMethod {
                param([psobject]$obj,[string]$line)
                process {
                    $obj | Add-Member -Name $_.Name -MemberType NoteProperty -Value ($_.GetValue($line))
                }
            }
            $obj
        }
    }
    process {
        [string[]]$output = (NET.EXE VIEW $ComputerName)
        [string]$headers = $output[4] #find the data's heading row
        $output = $output[7..($output.Length-3)] #keep only the data rows
        $Splitter | %{$_.Initialise($headers)}
        foreach($line in $output) { 
            [psobject]$result = new-object -TypeName PSObject -Property @{ComputerName=$ComputerName;}
            $Splitter | %{$_.Process($result,$line)}
            $result | Add-Member '_ShareNameColumnName' -MemberType NoteProperty -Value $ShareName
            $result | Add-Member 'Path' -MemberType ScriptProperty -Value {("\\{0}\{1}" -f $this.ComputerName,$this."$($this._ShareNameColumnName)")}
            $result | Add-Member 'Item' -MemberType ScriptProperty -Value {Get-Item ($this.Path)}
            $result | Add-Member -MemberType MemberSet -Name PSStandardMembers -Value ([System.Management.Automation.PSMemberInfo[]]@(New-Object System.Management.Automation.PSPropertySet(‘DefaultDisplayPropertySet’,[string[]](@('ComputerName','Path') + $ColumnHeadings))))
            $result
        }
    }
}

[string[]]$myServers = 'myServer1','myServer2' #amend this line to get the servers you're interested in
[psobject[]]$shares = $myServers | Get-SharedFolder
write-host 'List of Shares' -ForegroundColor Cyan
$shares  | ft -AutoSize
write-host 'Shares as Get-Item output' -ForegroundColor Cyan
$shares  | select -expand Item

1

Windows 8 या उच्चतर और Windows Server 2012 या उच्चतर पर, आप SmbShare मॉड्यूल से Get-SmbShare का उपयोग कर सकते हैं ।


0

Windows संसाधन किट उपकरण: rmtshare

या तो रिमोट सर्वर पर व्यवस्थापक अनुमतियों के साथ आईडी के तहत चलाएं या रिमोट सर्वर के लिए एक ipc $ कनेक्शन बनाएं।

rmtshare \\servername

क्या आप समस्या के समाधान के लिए आवश्यक कदमों को शामिल करने के लिए अपने उत्तर को थोड़ा और बढ़ा सकते हैं?
Cfinley

0

यहां एक PowerShell एक लाइनर है जो सभी दूरस्थ शेयरों को एक उपयोगकर्ता को देखने के लिए शुद्ध दृश्य का उपयोग करता है - इसका मतलब यह नहीं है कि उनके पास पहुंच है।

net view | Where {$_ -like "\\*"} | %{$comp = $_.Split(" ")[0]; net view $comp | Where {$_ -like "*Disk*"} | %{$share = $_.Split(" ")[0]; $fullpath = Join-Path $comp $share; $fullpath}}

यदि आप यह देखना चाहते हैं कि क्या उनके पास (कम से कम) पहुंच है, तो आप चला सकते हैं:

Net view | Where {$_ -like "\\*"} | %{$comp = $_.Split(" ")[0]; net view $comp | Where {$_ -like "*Disk*"} | %{$share = $_.Split(" ")[0]; $fullpath = Join-Path $comp $share; [PSCustomObject]@{Path=$fullpath;HasAccess=$(Test-Path $fullpath -ErrorAction SilentlyContinue)}}}

यदि आपको सहेजे गए आउटपुट की आवश्यकता है, तो आप इसे अंतिम ब्रैकेट के बाद निम्न पर फेंककर एक्सपोर्ट-सीएसवी में पाइप कर सकते हैं:

| Export-CSV "\\path\to\file.csv" -NoTypeInformation

जब नेट दृश्य एक त्रुटि फेंकता है तो यह पूरी तरह से सही नहीं है, लेकिन मैंने इसे यहां टिप्पणियों के आधार पर लिखा है और यह बहुत अच्छी तरह से काम करता है और मुझे जो चाहिए, उसके लिए सहायक है, इसलिए मैंने सोचा कि मैं साझा करूंगा। :)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.