PowerShell Проблема, связанная с входом в сеанс PS и настройкой разрешений - PullRequest
0 голосов
/ 10 мая 2018

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

Для этого мне нужно войти в сеанс PSSession, найти папку и установить разрешения. К сожалению, это не работает. Любая помощь будет оценена.

Сценарий

#Get ADM Credentials
$Cred = Get-Credential

# PowerShell's New-Item creates a folder
$Name = Read-Host "What is the name of the folder?"
$Location = Read-Host "What is the folder path? i.e B:\Collaboration\"
New-Item -Path $Location -Name $Name -ItemType "directory"
#Invoke-Item $Location

# Powershell creates an AD group
$Groupname = Read-Host "What is the group name? i.e. SS COLLABORATION BEN"
New-ADGroup -path "OU=StorSimple Centralisation Groups,OU=Groups,OU=Northgate PLC,DC=northgatevehiclehire,DC=net" -Name $Groupname -GroupCategory Security -GroupScope Global -DisplayName $Groupname -Description "Access to $Location" -Credential $cred


#Connect to StudFS01
$Folderpath = Read-Host "What is the path of the folder in StudFS e drive? i.e. Vehicle Sales\TOM Information" 
Enter-PSSession -ComputerName Studfs01 -Credential $Cred
Start-Sleep -Seconds 10
Set-Location -Path E:\CentralisedData\Data\$folderpath

#Set Permissions
$rule=new-object System.Security.AccessControl.FileSystemAccessRule ("northgatevehiclehire.net\Domain Admins","FullControl","Allow")
$rule2=new-object System.Security.AccessControl.FileSystemAccessRule ("northgatevehiclehire.net\StorSimple Centralisation Administrators","FullControl","Allow")
$rule3=new-object System.Security.AccessControl.FileSystemAccessRule ("$Groupname","Modify","Allow")
$acl = Get-ACL E:\CentralisedData\Data\$folderpath
$acl.SetAccessRule($rule,$rule2,$rule3)
Set-ACL -Path E:\CentralisedData\Data\$folderpath -AclObject $acl

Ошибка, которую я получаю ниже

Set-Location: не удается найти диск. Диск с именем «E» не существует. В C: \ Users \ ben.curtis-haigh \ Documents \ New Security Group Script.ps1: 19 char: 1 + Set-Location -Path E: \ CentralisedData \ Data \ $ folderpath + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~ + CategoryInfo: ObjectNotFound: (E: String) [Set-Location], DriveNotFoundException + FullyQualifiedErrorId: DriveNotFound, Microsoft.PowerShell.Commands.SetLocationCommand

Get-ACL: не удается найти диск. Диск с именем «E» не существует. В C: \ Users \ ben.curtis-haigh \ Documents \ New Security Group Script.ps1: 25 char: 8 + $ acl = Get-ACL E: \ CentralisedData \ Data \ $ folderpath + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo: ObjectNotFound: (E: String) [Get-Acl], DriveNotFoundException + FullyQualifiedErrorId: DriveNotFound, Microsoft.PowerShell.Commands.GetAclCommand

Вы не можете вызвать метод для выражения с нулевым значением. В C: \ Users \ ben.curtis-haigh \ Documents \ New Security Group Script.ps1: 26 char: 1 + $ acl.SetAccessRule ($ rule, $ rule2, $ rule3) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo: InvalidOperation: (:) [], RuntimeException + FullyQualifiedErrorId: InvokeMethodOnNull

Set-Acl: Невозможно привязать аргумент к параметру 'AclObject', поскольку он имеет значение null В C: \ Users \ ben.curtis-haigh \ Documents \ New Security Group Script.ps1: 27 char: 62 + Set-ACL -Path E: \ CentralisedData \ Data \ $ folderpath -AclObject $ acl + ~~~~ + CategoryInfo: InvalidData: (:) [Set-Acl], ParameterBindingValidationException + FullyQualifiedErrorId: ParameterArgumentValidationErrorNullNotAllowed, Microsoft.PowerShell.Commands.SetAclCommand`

Спасибо

Ответы [ 2 ]

0 голосов
/ 16 мая 2018
    Instead of Enter-PSSession which is meant for interactive use, you need to establish a new PSSession and then use Invoke-Command against it. Something like this:

$PSSession = New-PSSession -ComputerName Studfs01 -Credential $Cred

Invoke-Command -Session $PSSession -ScriptBlock {
  <CODE TO EXECUTE ON REMOTE SYSTEM HERE>
}
If you need to pass parameters/variables, you have two choices. The easiest (in newer versions of PowerShell) is the using statement like this:

$PSSession = New-PSSession -ComputerName Studfs01 -Credential $Cred

Invoke-Command -Session $PSSession -ScriptBlock {
   Set-Location -Path E:\CentralisedData\Data\$using:Folderpath
}
Another option is to pass your arguments with -ArgumentList and use Param() in the script block like this:

$PSSession = New-PSSession -ComputerName Studfs01 -Credential $Cred

Invoke-Command -Session $PSSession -ArgumentList $Folderpath -ScriptBlock {
   Param($Folderpath)
   Set-Location -Path E:\CentralisedData\Data\$Folderpath
}
0 голосов
/ 15 мая 2018

Вместо Enter-PSSession, который предназначен для интерактивного использования, вам нужно установить новый PSSession, а затем использовать Invoke-Command против него.Примерно так:

$PSSession = New-PSSession -ComputerName Studfs01 -Credential $Cred

Invoke-Command -Session $PSSession -ScriptBlock {
  <CODE TO EXECUTE ON REMOTE SYSTEM HERE>
}

Если вам нужно передать параметры / переменные, у вас есть два варианта.Самым простым (в более новых версиях PowerShell) является оператор using, подобный следующему:

$PSSession = New-PSSession -ComputerName Studfs01 -Credential $Cred

Invoke-Command -Session $PSSession -ScriptBlock {
   Set-Location -Path E:\CentralisedData\Data\$using:Folderpath
}

Другой вариант - передать аргументы с помощью -ArgumentList и использовать Param () в блоке скрипта следующим образом:

$PSSession = New-PSSession -ComputerName Studfs01 -Credential $Cred

Invoke-Command -Session $PSSession -ArgumentList $Folderpath -ScriptBlock {
   Param($Folderpath)
   Set-Location -Path E:\CentralisedData\Data\$Folderpath
}
...