spsman
Goto Top

Powershell remote Session: UnauthorizedAccessException

Hi,
Ich möchte ein Powershell Script auf einem anderen PC ausführen.

Führe ich den Scriptblock local auf dem Zeil PC aus läuft alles.
Mach ich das per PSSession kommt ein Fehler.

Script das ausgeführt werden soll:
param (
    [STRING]$mac_input = 'AA-BB-CC-11-22-33'  
)

function WakUp{
    [CmdletBinding()]
    Param( [Parameter(Mandatory=$True)][STRING]$mac = 'AA-BB-CC-11-22-33')  

    [System.Net.NetworkInformation.NetworkInterface]::GetAllNetworkInterfaces() | Where-Object { $_.NetworkInterfaceType -ne [System.Net.NetworkInformation.NetworkInterfaceType]::Loopback -and $_.OperationalStatus -eq [System.Net.NetworkInformation.OperationalStatus]::Up } | ForEach-Object {
        $networkInterface = $_
        $localIpAddress = ($networkInterface.GetIPProperties().UnicastAddresses | Where-Object { $_.Address.AddressFamily -eq [System.Net.Sockets.AddressFamily]::InterNetwork })[0].Address
        $targetPhysicalAddress = [System.Net.NetworkInformation.PhysicalAddress]::Parse(($mac.ToUpper() -replace '[^0-9A-F]',''))  
        $targetPhysicalAddress
        $targetPhysicalAddressBytes = $targetPhysicalAddress.GetAddressBytes()
        $packet = [byte[]](,0xFF * 102)
        6..101 | Foreach-Object { $packet[$_] = $targetPhysicalAddressBytes[($_ % 6)] }
        $localEndpoint = [System.Net.IPEndPoint]::new($localIpAddress, 0)
        $targetEndpoint = [System.Net.IPEndPoint]::new([System.Net.IPAddress]::Broadcast, 9)
        $client = [System.Net.Sockets.UdpClient]::new($localEndpoint)
        try { $client.Send($packet, $packet.Length, $targetEndpoint) | Out-Null } finally { $client.Dispose() }
    }
}

If ($MyInvocation.Line[0] -ne "."){  
    WakUp -mac $mac_input

}

Der Remote Aufruf:

$pwd = ".\Invoke.pw"  
            #User-Objekt erstellen
            $cred = New-Object -TypeName System.Management.Automation.PSCredential "Domain\Alle", (Get-Content $pwd | ConvertTo-SecureString)  
            # Befehle für Remote PC erstellen
            $mac = 'AA-BB-CC-11-22-33'  
            $InvScript = {\\server01\WOL_Script.ps1 -mac $mac |Out-File -FilePath "C:\Temp\PS_LOG.txt"}  
            # Befehl auf anderem PC ausführen
            $PSs = New-PSSession -ComputerName Prakt-01 -Credential $cred
            Write-Host "hallo"  
            Invoke-Command -Session $PSs -ScriptBlock $InvScript

Die Ausgabe:

hallo
Zugriff verweigert
    + CategoryInfo          : OperationStopped: (:) [], UnauthorizedAccessException
    + FullyQualifiedErrorId : System.UnauthorizedAccessException
    + PSComputerName        : Prakt-01
 

Der User "ALLE" ist local in der Gruppe Remoteverwaltung.
Mehr Lösungsansätze habe ich beim googlen auch nicht gefunden. habe ihr ne Idee?

Danke.

Content-Key: 21955491327

Url: https://administrator.de/contentid/21955491327

Printed on: February 24, 2024 at 16:02 o'clock

Member: DerWoWusste
DerWoWusste Oct 19, 2023 at 11:00:35 (UTC)
Goto Top
Hi.

Ich bin kein Freund von PSRemoting, aber dazu später.
Bist Du sicher, dass die Gruppenmitgliedschaft reicht?
Funktioniert der Befehl als Mitglied der Admingruppe (Admingruppe auf dem Remotesystem)?

Ich führe Befehle remote als "immediate scheduled task", der als Executor das Systemkonto ("System") nutzt, aus. Somit erspare ich mir jegliche mit psremoting verbundenen Sicherheitsrisken.
Member: SPSman
SPSman Oct 22, 2023 at 10:41:20 (UTC)
Goto Top
Hi,
der User "Domain\Alle" ist auf dem Ziel PC Lokal auch Admin. Ein "scheduled Task" ist jedoch ein zeitgesteuerter Task. hier geht es jedoch darum das ein User über VPN ein WOL Kommando erzeugen kann. Dazu möchte ich eben jenen Immer an PC nutzen. Quasi als WOL Server....

Nur habe ich nicht die Zeit mich mit WOL Servern auseinander zu setzen.
Member: SPSman
Solution SPSman Oct 22, 2023 at 19:05:09 (UTC)
Goto Top
Die Lösung ist das gesamte Script nicht in einer PS1 Datei zu speichern sondern direkt in einem Scriptblock. Dei Erstellung des Scriptblocks kann man jedoch wieder in einer .ps1 Datei auslagern und in einer Function kapseln:

...
# Befehle für Remote PC erstellen
            $iscript = Get-IvnScriptblock -mac_input $WOLobj.'Eindeutige ID'  
...
PS1-Datei
function Get-IvnScriptblock{    
    [CmdletBinding()]
    param (
    [STRING]$mac_input = 'AA-BB-CC-11-22-33'  
    )

$Script = {
        function WakUp{
        [CmdletBinding()]
        Param( [Parameter(Mandatory=$True)][STRING]$mac = 'AA-BB-CC-11-22-33')  

        [System.Net.NetworkInformation.NetworkInterface]::GetAllNetworkInterfaces() | Where-Object { $_.NetworkInterfaceType -ne [System.Net.NetworkInformation.NetworkInterfaceType]::Loopback -and $_.OperationalStatus -eq [System.Net.NetworkInformation.OperationalStatus]::Up } | ForEach-Object {
            $networkInterface = $_
            $localIpAddress = ($networkInterface.GetIPProperties().UnicastAddresses | Where-Object { $_.Address.AddressFamily -eq [System.Net.Sockets.AddressFamily]::InterNetwork })[0].Address
            $targetPhysicalAddress = [System.Net.NetworkInformation.PhysicalAddress]::Parse(($mac.ToUpper() -replace '[^0-9A-F]',''))  
            $targetPhysicalAddress
            $targetPhysicalAddressBytes = $targetPhysicalAddress.GetAddressBytes()
            $packet = [byte[]](,0xFF * 102)
            6..101 | Foreach-Object { $packet[$_] = $targetPhysicalAddressBytes[($_ % 6)] }
            $localEndpoint = [System.Net.IPEndPoint]::new($localIpAddress, 0)
            $targetEndpoint = [System.Net.IPEndPoint]::new([System.Net.IPAddress]::Broadcast, 9)
            $client = [System.Net.Sockets.UdpClient]::new($localEndpoint)
            try { $client.Send($packet, $packet.Length, $targetEndpoint) | Out-Null } finally { $client.Dispose() }
        }
    }

            
                    
        WakUp -mac 'AA-BB-CC-11-22-33' |Out-File -FilePath "C:\Temp\PS_LOG.txt"  

    }#ENd Script

Return [Scriptblock]::Create($Script -Replace('AA-BB-CC-11-22-33',$mac_input))