Nextcloud API-Aufruf für Upload und Erstellen einer Freigabe mit Ausgabe
Es geht um eine Nextcloud 22.2.0
Es soll via Powershell von einer Workstation eine Datei in ein angelegtes Verzeichnis kopiert werden und eine Freigabe erstellt werden welche dann ausgegeben wird.
Bei dieser PS bekomme ich folgende Fehlermeldung :
Script :
Hat jemand eine Idee ?
Danke
Es soll via Powershell von einer Workstation eine Datei in ein angelegtes Verzeichnis kopiert werden und eine Freigabe erstellt werden welche dann ausgegeben wird.
Bei dieser PS bekomme ich folgende Fehlermeldung :
Invoke-RestMethod : Der Remoteserver hat einen Fehler zurückgegeben: (401) Nicht autorisiert.
In Zeile:10 Zeichen:1
+ Invoke-RestMethod -Uri $oc$dav_endpoint$targetname -Method Put -Body ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-RestMethod], WebException
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand
Invoke-RestMethod : {"ocs":{"meta":{"status":"failure","statuscode":997,"message":"Current user is not logged in","totalitems":"","itemsperpage":""},"data":}}
In Zeile:22 Zeichen:13
+ $response = Invoke-RestMethod -Uri $oc$sharing_api -Method Post -Head ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-RestMethod], WebException
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand
Script :
$user = "Username"
$pass= "PaswortUser"
$secpasswd = ConvertTo-SecureString $pass -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential($user, $secpasswd)
# Upload the file
$body = $(get-content c:\scripte\tdh.png -raw)
$targetname = "tdh.png"
$oc = "https://URL-Zum-Nextcloud.com/"
$dav_endpoint = "remote.php/dav/files/Username/"
Invoke-RestMethod -Uri $oc$dav_endpoint$targetname -Method Put -Body $body -Credential $credential
# Create a public share for that file:
$headers = @{"Ocs-APIREQUEST"="true"}
$sharing_api = "ocs/v1.php/apps/files_sharing/api/v1/shares?format=json"
# Required parameters to create the share:
$body = @{
path = "/$($targetname)"
shareType = "3"
}
$response = Invoke-RestMethod -Uri $oc$sharing_api -Method Post -Headers $headers -Body $body -Credential $credential
# Print the public link URL:
echo $response.ocs.data.url
Hat jemand eine Idee ?
Danke
Please also mark the comments that contributed to the solution of the article
Kommentar vom Moderator colinardo am Dec 23, 2021 um 16:01:28 Uhr
Codetags hinzugefügt
Content-ID: 1652390240
Url: https://administrator.de/forum/nextcloud-api-aufruf-fuer-upload-und-erstellen-einer-freigabe-mit-ausgabe-1652390240.html
Printed on: January 18, 2025 at 14:01 o'clock
17 Comments
Latest comment
Es wäre sicher für alle sehr hilfreich wenn du Code Tags benutzen würdest !!
Formatting instructions in the posts
So wie oben ist der Code doch völlig unleserlich !
(Kann man übrigens mit dem "Bearbeiten" Knopf immer nachträglich korrigieren !)
Formatting instructions in the posts
So wie oben ist der Code doch völlig unleserlich !
(Kann man übrigens mit dem "Bearbeiten" Knopf immer nachträglich korrigieren !)
Servus,
erstens Passwörter solltest du in Hochkommas statt Anführungszeichen da ansonsten spezielle Zeichen wie das Dollarzeichen etc. zu einer fehlerhaften Authorization führen weil sie von der PS umgewandelt werden. Des weiteren Endpoint minimal anpassen und den Authorization-Header in den Header packen, das hier klappt in einem Test problemlos
By the way, ich würde dir hier dringend raten nicht die echten Credentials des Users im Skript zu verwenden sondern App-Passwörter für diesen generieren und benutzen. Diese kannst du entweder in den Nextcloud-Security-Settings erstellen:
Oder du forderst ein App-Passwort direkt automatisiert mit der Powershell an
Details zu diesem Vorgang findest du hier
https://docs.nextcloud.com/server/latest/developer_manual/client_apis/Lo ...
Grüße Uwe
Frohes Fest 🎄
erstens Passwörter solltest du in Hochkommas statt Anführungszeichen da ansonsten spezielle Zeichen wie das Dollarzeichen etc. zu einer fehlerhaften Authorization führen weil sie von der PS umgewandelt werden. Des weiteren Endpoint minimal anpassen und den Authorization-Header in den Header packen, das hier klappt in einem Test problemlos
$user = 'Username'
$pass= 'PasswortUser'
$credential = (new-Object PSCredential($user,(ConvertTo-SecureString $pass -AsPlainText -Force)))
$body = get-content 'c:\scripte\tdh.png' -raw
$targetname = "tdh.png"
$oc = "https://URL-Zum-Nextcloud.com"
# upload file
Invoke-RestMethod -Uri "$oc/remote.php/dav/files/$user/$targetname" -Method Put -Body $body -Credential $credential
$headers = @{
'OCS-APIRequest' = 'true'
Authorization = "Basic $([Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes("${user}:${pass}"))))"
}
# create share
$response = Invoke-RestMethod -Uri "$oc/ocs/v2.php/apps/files_sharing/api/v1/shares" -Method Post -Headers $headers -Body @{path="/$targetname";shareType=3}
# ... and output sharelink
$response.ocs.data.url
By the way, ich würde dir hier dringend raten nicht die echten Credentials des Users im Skript zu verwenden sondern App-Passwörter für diesen generieren und benutzen. Diese kannst du entweder in den Nextcloud-Security-Settings erstellen:
Oder du forderst ein App-Passwort direkt automatisiert mit der Powershell an
# first request to get webview url
$auth = irm "$endpoint/index.php/login/v2" -Method Post
# start url with default browser
start $auth.login
$login = $null
# start polling credentials while user logs in with his credentials and grants access to his account
while(!$login){
try{
$login = irm $auth.poll.endpoint -Method Post -Body @{token=$auth.poll.token}
}catch{}
sleep 2
}
# output Username and App Password
$login.loginName
$login.appPassword
Details zu diesem Vorgang findest du hier
https://docs.nextcloud.com/server/latest/developer_manual/client_apis/Lo ...
Grüße Uwe
Frohes Fest 🎄
Hmm, ich bekommen nun diese Meldung :
Du hast immer noch das Leerzeichen im Header drin (Zeile 23), hatte das oben bereits in meinem Original-Post korrigiert, du hast es aber nicht in den Code übernommen!Fehlerhafte Version
'OCS-APIRequest '= 'true'
'OCS-APIRequest' = 'true'
Sauber colinardo, funktioniert.
Bitte dann auch nicht vergessen den Thread als gelöst zu schliessen !!How can I mark a post as solved?
Immer gerne.
Referenz fürs Sharing ist wie immer hier nachzulesen
https://docs.nextcloud.com/server/latest/developer_manual/client_apis/OC ...
Grüße und guten Rutsch
Uwe
Ein FRage hätte ich da noch, können so auch Verzeichnisse freigegeben werden ?
Ja klar. Einfach nur den Pfad (path) auf den Ordner statt einer Datei zeigen lassen. Also im Body des Share-Aufrufs den Pfad angeben@{path="/pfad/zum/ordner";shareType=3}
Referenz fürs Sharing ist wie immer hier nachzulesen
https://docs.nextcloud.com/server/latest/developer_manual/client_apis/OC ...
Grüße und guten Rutsch
Uwe