2014-01-24 83 views
7

我有一個Credential對象的數組,我想測試這些憑據有權將文件寫入文件共享。如何使用憑證測試寫入文件共享路徑?

我會做這樣的事情

$myPath = "\\path\to\my\share\test.txt" 
foreach ($cred in $credentialList) 
{ 
    "Testing" | Out-File -FilePath $myPath -Credential $cred 
} 

,但後來我發現,Out-File不採取Credential作爲參數。解決這個問題的最好方法是什麼?

回答

4

您可以使用New-PSDrive來:

$myPath = "\\path\to\my\share" 

foreach ($cred in $credentialList) 
{ 
    New-PSDrive Test -PSProvider FileSystem -Root $myPath -Credential $Cred 
    "Testing" | Out-File -FilePath Test:\test.txt 
    Remove-PSDrive Test 
} 
+1

我明白了。 '提供者不支持使用憑證。再次執行該操作,而無需指定憑據。「 –

+0

對不起。似乎是版本特定的。它適用於V4,但不是V2/3 – mjolinor

+0

我現在要使用PowerShell 4,所以這對我很有用 –

3

嘗試使用Invoke-Command函數。它將採用憑證對象,並允許您在該命令下運行任意腳本塊。你可以用它來測試出寫入文件

Invoke-Command -ScriptBlock { "Testing" | Out-File $myPath } -Credential $cred 
+0

我得到'Invoke-Command:參數集無法使用指定的命名參數解析。' –

5

這裏是asituation其中一個古老的EXE(NET.EXE)似乎做得比PowerShell的更好。 .. 我想你可以嘗試用映射然後提供的憑據網絡驅動器測試將文件寫入到驅動器:

$cred=get-credential 
$pass=$cred.GetNetworkCredential().Password 
net use q: \\servername\share $pass /user:$cred.username 
4

使用該腳本從微軟TechNet腳本美分取呃:http://gallery.technet.microsoft.com/scriptcenter/Lists-all-the-shared-5ebb395a

這是一個很容易改變,以適應您的需求,然後從頭開始完全。 打開ListSharedFolderPermissions.ps1,並找到三個$Properties變量。在每一個這樣你可以告訴你在看哪個用戶,所以現在應該是這樣的頂部添加一行:

$Properties = @{'Username' = $Credential.UserName 
       'ComputerName' = $ComputerName 
        . . . . .     } 

接下來,新的用戶名屬性添加到選擇對象行(3次):

$Objs|Select-Object Username,ComputerName,ConnectionStatus,SharedFolderName,SecurityPrincipal, ` 
     FileSystemRights,AccessControlType 

一旦您在六個合適的地方添加這些小塊你的腳本就可以使用:

cd c:\Path\where\you\put\ps1\file 
$permissions = @() 
$myPath = "computername" 
foreach ($cred in $credentialList) 
{ 
    $permissions += .\ListAllSharedFolderPermission.ps1 -ComputerName $myPath -Credential $cred 
    $permissions += " " 
} 
$permissions | Export-Csv -Path "C:\Permission.csv" -NoTypeInformation 
3

我認爲Invoke-command辦法應該工作。但如果沒有任何工作,你可以嘗試powershell impersonation module。無需-Credential開關,即可成功爲大多數Powershell命令模擬用戶。

3

幾個想法:

我很喜歡我自己也在PowerShell提供程序中工作,但我決定儘快做出一些事情,所以我使用了WScript.Network庫。我使用了一個哈希表來跟蹤用戶是否會被「認證」。

$credentials = @() # List of System.Net.NetworkCredential objects 

$authLog = @{} 
$mappedDrive = 'z:' 
$tmpFile = $mappedDrive, '\', [guid]::NewGuid(), '.tmp' -join '' 
$path = [io.path]::GetPathRoot('\\server\share\path') 

$net = new-object -comObject WScript.Network 
foreach ($c in $credentials) { 
    if ($authLog.ContainsKey($c.UserName)) { 
     # Skipping because we've already tested this user. 
     continue 
    } 
    try { 
     if (Test-Path $mappedDrive) { 
      $net.RemoveNetworkDrive($mappedDrive, 1) # 1 to force 
     } 

     # Attempt to map drive and write to it 
     $net.MapNetworkDrive($mappedDrive, $path, $false, $c.UserName, $c.Password) 
     out-file $tmpFile -inputObject 'test' -force 

     # Cleanup 
     Remove-Item $tmpFile -force 
     $net.RemoveNetworkDrive($mappedDrive, 1) 

     # Authenticated. 
     # We shouldn't have reached this if we failed to mount or write 
     $authLog.Add($c.UserName, 'Authorized') 
    } 
    catch [Exception] { 
     # Unathenticated 
     $authLog.Add($c.UserName, 'Unauthorized') 
    } 
} 
$authLog 

# Output 

Name       Value 
----       ----- 
desktop01\user01    Authorized 
desktop01\user02    Unauthorized