Проблемы с Test-Path - PullRequest
0 голосов
/ 14 мая 2019

Я пытаюсь перечислить общие ресурсы Windows (admin) удаленно, а затем Test-Path для каждого общего ресурса, чтобы проверить наличие папки. Проблема в том, что Test-Path возвращает «True» только в том случае, если учетная запись, в которой запущен powershell.exe, имеет разрешения на просмотр рассматриваемой папки. Поэтому я пытаюсь открыть новый powershell.exe и запустить скрипт в контексте пользователя, у которого есть разрешения.

#share enumeration and Test-Path
$scriptBlock = {
    Param ([System.Management.Automation.PSCredential]$cred)
    $shares = Get-WmiObject -Class Win32_Share -ComputerName COMPUTER -Credential $cred
    $sharename = $shares.Name
    $sharename #shares are correctly enumerated
    foreach ($name in $sharename) {
        $name1 = '\\COMPUTER' + $name + '\FOLDER'
        $name1 #UNC location is correctly set e.g. \\COMPUTER\d$\FOLDER
        $path = Test-Path -Path $name1
        Write-Host $path #always returns FALSE
    }
}

$username = "user"
$password = ConvertTo-SecureString "password" -AsPlainText -Force
$cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $username, $password

Start-Process powershell -ArgumentList "-noexit -command & {$scriptBlock}  $cred"

Команда Start-Process неправильно получает учетные данные, хранящиеся в $cred, но запрашивает учетные данные. Даже если указаны правильные учетные данные, вывод Test-Path возвращает FALSE для всех общих ресурсов. powershell.exe работает в контексте текущего пользователя. Если я добавлю текущего пользователя в качестве администратора удаленного компьютера, Test-Path вернет TRUE для местоположения, содержащего «\ FOLDER». Этот сценарий - не то, чего я пытаюсь достичь, так как мы будем запускать этот сценарий удаленно через среду.

1 Ответ

2 голосов
/ 14 мая 2019

Не используйте простые текстовые пароли в сценариях, особенно при использовании прав администратора. Вы подвергаете себя и свою организацию ненужным рискам.

Если вы не хотите, чтобы во время выполнения скрипта запрашивались кредиты, вам необходимо заранее их сохранить в безопасном режиме и оттуда звонить. В Интернете существует множество статей о защите учетных данных в сценариях PowerShell, использовании диспетчера учетных данных Windows, защищенных XML-файлов или даже реестра.

Это ...

Start-Process powershell -ArgumentList "-noexit -command & {$scriptBlock}  $cred"

... неверный синтаксис. Должно быть это ...

Start-Process powershell -ArgumentList "-noexit -command & {$scriptBlock}" -Credential $Cred

Start-Process - у него есть свойство учетных данных.

Наконец, если вы запускаете это со своей рабочей станции, и у вас есть разрешения для этого, тогда почему вы вообще передаете кредиты? Ваш интерактивный вход в систему, если вы вошли в систему с учетной записью, у которой есть привилегии на цели, это будет просто работать, и вам вообще не понадобится Start-Process.

Например, просто делать это ...

# share enumeration and Test-Path
# Using variable squeezing to assign and output variable, debug validation effort

# $scriptBlock = {
    # Pick a random AD computer and show all shares
    "`n***"
    "*** List all share data  ***"
    "***`n"
    ($shares = Get-WmiObject -Class Win32_Share -ComputerName (Get-ADComputer -Filter '*').Name[7])

    # Process test validation
    "`n***"
    "*** Testing share path ***"
    "***`n"
    foreach ($share in $shares) 
    { ($sharename = "\\$($share.PSComputerName)\$($share.Name)") + ' : ' + ($path = Test-Path -Path $sharename)}
# }

Получил бы это ...

# Results

***
*** List all share data  ***
***


Name        Path                                   Description                                            
----        ----                                   -----------                                            
ADMIN$      C:\Windows                             Remote Admin
C$          C:\                                    Default share
install     C:\install                                       
IPC$                                               Remote IPC
print$      C:\Windows\system32\spool\drivers      Printer Drivers

***
*** Testing share path ***
***

\\LabServer01\ADMIN$ : True
\\LabServer01\C$ : True
\\LabServer01\install : True
\\LabServer01\IPC$ : False
\\LabServer01\print$ : True

Теперь, если у ваших авторизованных кредитов не было разрешений, тогда, да, передайте их ...

($cred = Get-Credential -Credential "$env:USERDOMAIN\$env:USERNAME")

... в Start-Process или, что еще лучше, Invoke-Command , если PSRemoting включен.

($cred = Get-Credential -Credential "$env:USERDOMAIN\$env:USERNAME")

Invoke-Command -ComputerName $((Get-ADComputer -Filter '*').Name[7]) -ScriptBlock {
    # Pick a random AD computer and show all shares
    "`n***"
    "*** List all share data on $env:COMPUTERNAME  ***"
    "***`n"
    ($shares = Get-WmiObject -Class Win32_Share -ComputerName $env:COMPUTERNAME)

    # Process test validation
    "`n***"
    "*** Testing share path ***"
    "***`n" 
    $shares | ForEach-Object {
        Write-Host "Testing $($PSItem.Name) : "  -NoNewline
        Try {Test-Path -Path $PSItem.Path}
        Catch{"Path for $($PSItem) is empty"}
    }
} -Credential $cred


# Results

***
*** List all share data on LabServer01  ***
***


Name       Path                                      Description        PSComputerName                           
----       ----                                      -----------        --------------                           
ADMIN$     C:\Windows                                Remote Admin       LabServer01                                 
C$         C:\                                       Default share      LabServer01                                 
install    C:\install                                                   LabServer01  
IPC$                                                 Remote IPC         LabServer01                                 
print$     C:\Windows\system32\spool\drivers         Printer Drivers    LabServer01                                 

***
*** Testing share path ***
***

Testing ADMIN$ : True
Testing C$ : True
Testing install : True
Testing IPC$ : Path for Cannot bind argument to parameter 'Path' because it is an empty string. is empty
Testing print$ : True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...