Как заменить строку в файле на удаленном компьютере в Powershell? - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть виртуальная машина под управлением Windows Server 2012. И некоторые предполагаемые службы на ней.Я хочу удаленно изменить файл конфигурации на этой машине с моего настольного компьютера.В настоящее время я изменяю этот файл конфигурации, сопоставляя диск C: удаленного сервера, а затем изменяя файл.Теперь это блокирует меня от смены нескольких серверов, поскольку я не могу подключить несколько серверов c: одновременно к одному диску.Кроме того, отображение сотен дисков не было бы идеальным.Я изменяю файл с помощью сопоставления диска следующим образом:

$password = <password text> | ConvertTo-SecureString -asPlainText -Force
$username = "admin"
$credential = New-Object System.Management.Automation.PSCredential($username,$password)
net use Z: \\$ipAddress\C$ <password> /user:admin type 'z:\Program Files\lalaland\Data\Settings.xml'

(Get-Content 'z:\Program Files\lalaland\Data\Settings.xml') | ForEach-Object { $_ -replace $oldString, $newString } | Set-Content 'z:\Program Files\lalaland\Data\Settings.xml'
type 'z:\Program Files\lalaland\Data\Settings.xml'
net use z: /delete

Поэтому я искал лучший вариант и нашел этот скрипт на https://gallery.technet.microsoft.com/scriptcenter/PowerShell-Replace-String-58fbfa85, но он не работает для меня.

Я использую этот сценарий как:

.\Replace-StringInFile.ps1 -ComputerName  <RemoteComputerHostName> -TargetPath 'C:\Program Files\lalaland\Data' -Fil

eName Settings.xml -Replace $ oldString -ReplaceWith $ newString -Credential (Get-Credential)

, когда я запускаю командуПоявится окно с учетными данными и запросом имени пользователя и пароля.Я ввожу имя пользователя и пароль, которые я использовал для сопоставления диска, но он выдает следующую ошибку:

New-PSSession : [<RemoteHostName>] Connecting to remote server <RemoteHostName> failed with the following error message : The user name or password is incorrect. For more information, see the
about_Remote_Troubleshooting Help topic.
At D:\workspace\Replace-StringInFile.ps1:84 char:14
+ ...  $Session = New-PSSession -ComputerName $Computer -Credential $Creden ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : OpenError: (System.Manageme....RemoteRunspace:RemoteRunspace) [New-PSSession], PSRemotingTransportException
+ FullyQualifiedErrorId : LogonFailure,PSSessionOpenFailed

я не понимаю, когда я сопоставляю диск с теми же учетными данными, он работает нормально, ноиспользование другого скрипта, который внутренне использует New-PSSession, не работает.

Есть идеи?

1 Ответ

0 голосов
/ 05 декабря 2018

Мне удалось сделать это с помощью следующего командлета:

function Edit-RemoteFileStringReplace
{
  [cmdletbinding()]
  param([Parameter(Mandatory=$true)][ValidateScript({$_ -match [IPAddress]$_ })][string]$Address,
        [Parameter(Mandatory=$true)][string]$FilePath,
        [Parameter(Mandatory=$true)][string]$Replace,
        [Parameter(Mandatory=$true)][string]$ReplaceWith,
        [Parameter(Mandatory=$true)][System.Management.Automation.PSCredential]$Credential
  )

  $DriveLetter=""
  $FilePathWithoutDriveLetter=""

  $DriveName = $Address.replace('.','x')
  $DriveName = "PSDrive_$DriveName"

  $DriveLetter = (Get-DriveLetterFromPath -Path $FilePath).Substring(0,1)
  $FilePathWithoutDriveLetter = Remove-DriveLetterFromPath -Path $FilePath
  $MappedFilePath="$DriveName" + ":$FilePathWithoutDriveLetter"

  New-PSDrive -Name $DriveName -PSProvider FileSystem -Root \\$Address\$DriveLetter$ -Credential $Credential -ErrorAction Stop
  (Get-Content $MappedFilePath) | ForEach-Object { $_ -replace $Replace, $ReplaceWith } | Set-Content $MappedFilePath
  Remove-PSDrive -Name $DriveName
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...