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-ID: 21955491327

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

Ausgedruckt am: 19.11.2024 um 01:11 Uhr

DerWoWusste
DerWoWusste 19.10.2023 um 13:00:35 Uhr
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.
SPSman
SPSman 22.10.2023 um 12:41:20 Uhr
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.
SPSman
Lösung SPSman 22.10.2023 um 21:05:09 Uhr
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))