You are not logged in.
Hello,
J'ai fait un petit module Powershell pour manipuler GLPI à travers l'API Rest.
Il est disponible ici : https://github.com/J-C-P/PSGLPI
N'hésitez pas à faire des commentaire, à vous en servir, etc.
Bon amusement !
Offline
Super ! Merci Jean-Christophe !
Je vais tester ça.
Offline
Bonjour,
Je viens de tomber sur votre module.
Je vais probablement l'utiliser et je vous en remercie.
J'en était à l'étape de tester la lecture et modification des différents items.
Votre structure rendra mon code plus clair.
Offline
Bonjour,
Je viens de tomber sur votre module.
Je vais probablement l'utiliser et je vous en remercie.J'en était à l'étape de tester la lecture et modification des différents items.
Votre structure rendra mon code plus clair.
Salut,
Pour l'instant, il correspond à mes besoins qui ne sont sans doute pas aussi étendus que certains autres.
Si je peux ajouter ce qui manque, il ne faut pas hésiter à le dire.
Tant qu'à faire, autant que ça serve :-)
Quoi qu'il en soit, je suis là si il y a des questions.
Bon amusement!
Offline
Bonjour,
J’ai dû faire quelques ajustements.
Avec l'API de GLPI, après la création d'une session, la première requête me renvoie toujours un document html au lieu du résultat de la requête. Ensuite ça va.
Avec ta fonction, étant donné qu'elle crée une session et la termine à chaque commande, je dois en fait faire deux commandes en extra dans « GetGLPISessionToken » pour que ça fonctionne...
Je me doute que côté performance ce n'est pas l'idéal. Ne serait-ce pas mieux de garder la session en global et la terminé manuellement ?
Je prévois ajouter les éléments manquant dans « Get-GlpiSearchOptions », avec tous les plugins qui s'attache c'est pratique.
Je ne sais pas si c'est GLPI ou le CMDlet ConvertTo-Json qui ne respecte pas les normes mais j'ai un fix pour réparer un petit bug/anomalie sur lequel je suis tombé. Je vais essayer de te le pousser dans Github quand j'aurai le temps (je ne m'y connais pas trop et je suis vraiment débordé).
On se reparle bientôt.
Bonne journée.
Offline
Merci pour ces retours :-)
En effet, l'ouverture/fermeture des sessions n'est pas idéale en terme de performance.
Le truc, c'est que, dans mon cas, c'est surtout des updates qui sont faits suite à une action humaine, il y a donc de long délais entre les différentes actions et j'avais des sessions expirées.
Le top, ce serait de pouvoir tester si la connexion existe toujours et, si pas, la recréer. Mais je n'ai jamais franchi le pas...
Offline
En fait, pour clarifier en ce qui concerner l'ouverture de session. C'est surtout qu'il semble y avoir un bug de mon côté.
Je fais un initSession avec un token, ce qui me donne le token de session.
Mais la première requête que j'effectue par la suite, peu importe laquelle retourne du code HTML qui correspond à la page de connexion. (username, password, etc..)
J'ignore ce retour et dès la requête suivante, tous fonctionnent correctement.
Ce qui veut dire que si j'ai des fonctions qui ouvre et ferme les sessions à chaque commande, non seulement j'ai ces requêtes en extra, mais je dois ajouter une autre commande bidon à faire dans la fonction initSession.
Outre ce bug, c'est certain que dans l'idéal, le session token pourrait contenir une valeur d'expiration et il serait possible dans faire un refresh.
Le seul autre API avec lequel j'ai travaillé permettais de faire cela : https://www.questrade.com/api/documenta … horization
Offline
Hi,
If you want to exchange some knowledge visit my example of GLPI API in PowerShell
It works on Windows and Linux
Search at GithHub for: PowerShellPlace/GlpiTools
Best Regards!
Offline
Thanks for the comment.
I will have a look :-)
Offline
Thanks! I will take a look. Looks good
GLPI 9.4.3 - Currently in Dev environment - preparing for production
-Preparing data migration from OSTicket to GLPI for the Ticketing/Helpdesk part.
-Preparing data migration from OrangeSCRUM to GLPI for the project management part.
@Working at a company that is responsible for the IT environment of over 4500 employees that have IT assets
Offline
@SilentBob999 I translate your post, and question is: Do you have MyDashboard plugin ?
If Yes, disable it, and check PSModule of @Jean-Christophe one more time
I faced with that problem few months ago and solution were, resign from MyDashboard plugin
Kind Regards
Wojtek
Last edited by Turboooo (2019-06-14 17:03:54)
Best Regards!
Offline
@SilentBob999 I translate your post, and question is: Do you have MyDashboard plugin ?
If Yes, disable it, and check PSModule of @Jean-Christophe one more time![]()
I faced with that problem few months ago and solution were, resign from MyDashboard plugin
Kind Regards
Wojtek
Thanks, I will look into that
Offline
@Jean-Christophe
Voilà quelques ajouts/modification:
https://github.com/SilentBob999/PSGLPI
Vous pouvez faire des cherry-pick ou en copier le code que vous voulez. Je ne maitrise pas suffisament Git pour pousser une branche sur votre repo.
Merci
Offline
@SilentBob999
Merci :-)
Je vais intégrer le remove-items dans ma version.
Pour le reste, je n'ai pas trouvé, au premier coup d'oeil, les modif sur le json. Tu t'en souviens?
Encore merci pour ta participation
Offline
Pour le reste, je n'ai pas trouvé, au premier coup d'oeil, les modif sur le json. Tu t'en souviens?
Bonjour Jean-Christophe,
Il s'agissait de :
if (($Details["input"] | Get-Member -MemberType Properties).Count -eq 1){
$json = $json.Remove(($lastIndex = $json.LastIndexOf("]")),1).Insert($lastIndex,"").Remove(($firstIndex = $json.IndexOf("[")),1).Insert($firstIndex,"")
}
Je n'ai pas réussi à reproduite le problème que cela corrigeait.
J'avais comme souvenir que cela m'arrivait lorsque j'envoyais un tableau contenant un seul élément. Plus particulièrement lorsque je l'envoyais sous forme de PSCustomObject plutôt que de hashtable (c'était à cela que servait le count des propriétés je crois).
Mais maintenant le résultat de la conversion en JSON est pareil dans les deux cas (PSCustomObject vs hashtable) et GLPI ne bug plus (on a passé quelque version depuis) lorsqu’il y a un seul élément dans un tableau. Ex. :
Ceci ne fonctionnais pas avant, maintenant ça passe :
{"input": [ { "name": "CC test"} ]}
Bref, vaut mieux ignorer.
Offline
OK, merci pour le feedback. :-)
Offline
Bonjour
Je suis désolé, je n'arrive pas à faire fonctionner le module powershell
A chaque execution, j'obtiens une erreur 400 lors de la getGLPISessionToken
la variable $creds semble correctement renseignée (Usertoken = jeton API de l'utilisateur, authorizationType = user_token, AppToken = Clé definie pour l'adresse ip du User, puis l'url de l'apirest)
A chaque fois donc j'ai erreur 400 (demande incorrecte sur PSGLPI.PSM1:8 : 70, qui correspond à l'invoke-restMethod...
Néanmoins :
Je lance le Powershell sur mon PC. A aucun moment je n'ai donc une authentification demandée. (le site ne demande pas avec quel utilisateur je me connecte)
Du coup je me demande si la clé Usertoken est la bonne, ou plus exactement : comment la definir, vu que pas d'authentification...
Merci
GLPI 10.0.17
GLPIinventory 1.3.4
Agents : FI (2.6, 2.5) et Glpiagents (1.12)
Offline
Hi!
Documentation of GlpiTools Project is already at Website : https://www.wpietrzak.pl/projects/
Best Regards!
Offline
Hi All,
Two new blog posts
- https://www.wpietrzak.pl/glpi/StartGlpiTools/
- https://www.wpietrzak.pl/glpi/ThingsToKnowGlpiTools/
Best Regards!
Offline
Bonjour tout le monde
Encore bravo pour le plugin PSGLPI.
Quelqu'un pourrait-il me dire s'il a réussi à utiliser la fonction : Add-GlpiSubItem avec un document ?
Je dois sans aucun doute mal composer la variable $details.
Mais avec le code dans la fonction peu importe j'obtiens toujours : Invoke-RestMethod : ["ERROR_BAD_ARRAY","Le paramètre input doit être un tableau d'objets; Afficher la documentation dans votre navigateur...
Test1 :
$Details = @{
input=@{
name="Upload"
_filename="clear.png"}
}
Test2 :
$Details = @(
@{ name ="Uploaded document";};
@{ _filename= "clear.png";}; )
Test3:
$Details = @{
input=@{
name="Upload"
_filename="clear.png"}
}
Et j'en passe bien d'autres.
Mais nan ça ne veux pas s'upload
Si quelqu'un a la bonne syntaxe je suis preneur.
Offline
Ah, oui, non
L'upload ne passe pas. Je n'y suis jamais arrivé.
Je ne suis jamais parvenu à former un "uploadmanifest" qui lui plaise :-(
Quand j'en ai eu besoin, j'ai fini par faire un upload avec CURL, récupérer l'ID puis associer l'ID du document au ticket, à la FAQ, etc.
Sorry mais là, ça ne fonctionne pas.
C'est pas faute d'avoir essayé.
Offline
Ah, je comprend mieux
Si toi déjà tu n'as pas réussi je ne suis pas prêt de le faire fonctionner
En tout cas top pour les autres commandes.
Et tu sais pourquoi on doit passer par l'uploadmanifest ? Car quand on regarde ceux qui font en php on voit le input mais jamais l'autre
A tout hasard, si prochainement tu as le temps et si ça ne te pose pas de problème, tu saurais transmettre ton code "powershell -curl ? " car pareil la j'ai essayé de lancer directement du curl depuis powershell mais je n'ai pas le niveau
Dans tous les cas merci de m'avoir répondu.
Offline
Tu peux tenter avec ceci.
C'est un petit bout de script qui devrait être opérationnel.
Il faut quand même adapter deux ou trois détails, mais tu devrais t'y retrouver.
Function GetGLPISessionToken {
param($Creds)
#Get-Date -f T | write-host -NoNewLine
#Write-Host " Enter Function"
$Creds.AuthorizationType
if (("Basic","user_token") -ccontains $Creds.AuthorizationType) {
invoke-RestMethod "$($Creds.AppURL)/initSession" -Headers @{"Content-Type" = "application/json";"Authorization" = "$($Creds.AuthorizationType) $($Creds.UserToken)";"App-Token"=$Creds.AppToken}
}
else {Write-Host 'AuthorizationType MUST be "user_token" or "Basic". This is Case Sensitive.' -ForegroundColor Red}
}
$GlpiCreds = @{
AppURL = "https://servicedesk.***********/apirest.php"
UserToken = "***************"
AppToken = "*******************"
AuthorizationType = "user_token"
}
cls
$SessionToken = GetGLPISessionToken -Creds $GlpiCreds
$TicketID="05093"
$DocumentUpload = C:\curl\bin\curl.exe `
-X POST `
-H 'Content-Type: multipart/form-data' `
-H "Session-Token: $($SessionToken.session_token)" `
-H 'App-Token: z****************' `
-F 'uploadManifest={\"input\": {\"name\": \"Document ticket $($ticketID)\", \"_filename\" : [\"05093-010.pdf\"], \"tickets_id\":\"164\"}};type=application/json' `
-F 'filename[0]=@"J:\Locpub\INTERREGIO\GLPI\Incident\05093-010.pdf"' `
-s `
-k 'https://servicedesk.***************/apirest.php/Document/'
Invoke-RestMethod "$($GlpiCreds.AppUrl)/killSession" -Headers @{"session-token"=$SessionToken.session_token; "App-Token" = "$($GlpiCreds.AppToken)"}
$DocumentUpload = ConvertFrom-Json $DocumentUpload
$DocumentUpload.upload_result.filename.filesize
$DocumentUpload.id
$DocumentUpload.message
$details = @{
documents_id= "45"
items_id= "85"
itemtype= "Ticket"
entities_id= "0"
users_id= "2804"
date="1978-20-11 00:00"
}
#Add-GlpiSubItem -Creds $GlpiCreds -ItemType document -Details $details -ID 45 -SubItemType Document_Item
Offline
Un grand merci pour ton partage
Offline
Je ne sais pas si ça pourrait aider, mais une personne à publier ce bout de code en PYTHON pour réaliser l'upload sur GLPI.
ça pourrait peut être aiguiller certains ?
multipart_form_data = {
'uploadManifest': (None, '{"input": {"name": "test123.png", "_filename": ["test123.png"]}}'),
'file': ('test123.png', open('test123.png', 'rb')),
}
Je vais continuer de creuser
Last edited by Dead-Red (2021-04-13 22:17:44)
Offline