You are not logged in.

Announcement

 Téléchargez la dernière version stable de GLPI      -     Et vous, que pouvez vous faire pour le projet GLPI ? :  Contribuer
 Download last stable version of GLPI                      -     What can you do for GLPI ? :  Contribute

#1 2020-10-03 20:30:44

mrvls
Member
Registered: 2020-10-03
Posts: 18

Search Ticket via PowerShell

Bonjour/bonsoir,

Nous avons besoin d'automatiser des actions AD basées sur un formulaire.
Je cherche donc à sélectionner les tickets créés par ce formulaire sur le critère du nom (et peut être d'autres critères!) via PowerShell.

Pour le moment j'ai réussi assez simplement trouver un ticket via son ID:

$SearchResult = Invoke-RestMethod "$AppURL/Ticket/21763/" -Headers @{"session-token"=$SessionToken.session_token; "App-Token" = "$AppToken"}

Mais, autant je suis très à l'aise sur PowerShell, autant j'ai beaucoup de mal avec JSON (?). je ne vois pas bien où ni comment insérer mes "criteria" pour filtrer sur le nom.

Où puis-je d'ailleurs obtenir la liste des "fields" et leur numéro respectif?

Offline

#2 2020-10-03 21:54:12

mrvls
Member
Registered: 2020-10-03
Posts: 18

Re: Search Ticket via PowerShell

Une petite pause et je trouve mes réponses !

"Où puis-je d'ailleurs obtenir la liste des "fields" et leur numéro respectif?":
doc: /apirest.php#list-searchoptions

$listSearchOptions = Invoke-RestMethod $AppURL/listSearchOptions/Ticket -Headers @{"session-token"=$SessionToken.session_token; "App-Token" = "$AppToken"}

"sélectionner les tickets créés par ce formulaire sur le critère du nom":

$request = Invoke-RestMethod -Uri "$($AppURL)/search/Ticket?criteria[0][field]=1&criteria[0][searchtype]=0&criteria[0][value]=$name" -Headers @{"session-token"=$SessionToken.session_token;"App-Token" = "$AppToken"} -Method Get

Offline

#3 2020-10-03 22:51:30

mrvls
Member
Registered: 2020-10-03
Posts: 18

Re: Search Ticket via PowerShell

Bon je suis bien avancé avec ma recherche qui fonctionne correctement, même avec plusieurs critères!

Mais comment récupérer le contenu du ticket ? La "description" ? J'aurais peut être dû commencer par là...


/edit: pour obtenir plus de détails il faut interroger une autre adresse qui requête directement un ticket...

Invoke-RestMethod -Uri "$($AppURL)/Ticket/21763" -Headers @{"session-token"=$SessionToken.session_token;"App-Token" = "$AppToken"} -Method Get

Last edited by mrvls (2020-10-04 10:30:50)

Offline

#4 2020-10-04 11:45:12

mrvls
Member
Registered: 2020-10-03
Posts: 18

Re: Search Ticket via PowerShell

Tant que j'y suis, pour finir, voici comment récupérer le contenu d'un formulaire (formcreator) en array:

$ticket = Invoke-RestMethod -Uri "$($AppURL)/Ticket/21763" -Headers @{"session-token"=$SessionToken.session_token;"App-Token" = "$AppToken"} -Method Get
$html = [System.Web.HttpUtility]::HtmlDecode($ticket.content)
$fakeXML = [xml]$html
$fakeXML.ChildNodes

Offline

#5 2020-10-07 01:16:08

mrvls
Member
Registered: 2020-10-03
Posts: 18

Re: Search Ticket via PowerShell

Maintenant que j'ai ma liste de ticket, les détails des tickets, je peux également changer le statut:

$json = '{"input": {"tickets_id": "21845","status": "5"}}'
Invoke-RestMethod -Uri "$($AppURL)/Ticket/21845" -Headers @{"session-token"=$SessionToken.session_token;"App-Token" = "$AppToken"; "ContentType" = "application/json"} -Method Put -Body $json
$json = '{"input": {"tickets_id": "21845","status": "6"}}'
Invoke-RestMethod -Uri "$($AppURL)/Ticket/21845" -Headers @{"session-token"=$SessionToken.session_token;"App-Token" = "$AppToken"; "ContentType" = "application/json"} -Method Put -Body $json

Par contre impossible d'ajouter un commentaire (que ce soit ItilFollowup ou TicketFollowup, nous sommes en 9.4.4) avec:

$json = '{"input": {"itemtype": "Ticket","items_id": "21845","users_id": "3774","content": "test"}}'
Invoke-RestMethod -Uri "$($AppURL)/Ticket/21845/ItilFollowup" -Headers @{"session-token"=$SessionToken.session_token;"App-Token" = "$AppToken"; "ContentType" = "application/json"} -Method Put -Body $json
Invoke-RestMethod -Uri "$($AppURL)/ItilFollowup" -Headers @{"session-token"=$SessionToken.session_token;"App-Token" = "$AppToken"; "ContentType" = "application/json"} -Method Put -Body $json

Le retour est systématique, sans réel message d'erreur:

Length         : 0
LongLength     : 0
Rank           : 1
SyncRoot       : {}
IsReadOnly     : False
IsFixedSize    : True
IsSynchronized : False
Count          : 0

J'arrive bien à lire le commentaire ajouté graphiquement (uniquement avec ItilFollowup):

Invoke-RestMethod -Uri "$($AppURL)/Ticket/21845/ItilFollowup" -Headers @{"session-token"=$SessionToken.session_token;"App-Token" = "$AppToken"; "ContentType" = "application/json"} -Method Get

id                : 16849
itemtype          : Ticket
items_id          : 21845
date              : 2020-10-06 17:35:37
users_id          : 3774
users_id_editor   : 0
content           : <p>testgui</p>
is_private        : 0
requesttypes_id   : 0
date_mod          : 2020-10-06 17:35:37
date_creation     : 2020-10-06 17:35:37
timeline_position : 1
sourceitems_id    : 0
sourceof_items_id : 0
links             : {[...]}

Le problème doit venir du Body mais je n'ai plus de pistes..

Je vois bien que je parle seul mais si quelqu'un a une idée.. smile

Offline

#6 2020-10-12 23:07:51

LaDenrée
HELPER
Registered: 2012-11-19
Posts: 6,146

Re: Search Ticket via PowerShell

pour ajouter un suivi (ou n'importe quel objet) il faut utiliser la methode POST
la methode PUT est pour mettre à jour un objet déjà existant

ici le suivi n'existe pas encore, vous ne pouvez donc pas le mettre à jour.


Trouver la panne avant de réparer...
GLPI10.0.10 (ubuntu 22.04 PHP8.1  Mariadb10.6 ) plugins : comportements 2.7.2 reports 1.16.0 formcreator 2.13.8, datainjection 2.13.4 fields 1.21.6

Offline

#7 2020-10-13 13:16:13

Jean-Christophe
Moderator
Registered: 2007-08-22
Posts: 734

Re: Search Ticket via PowerShell

Hello,
Il existe un module powershell qui facilite grandement la manipulation de l'API de GLPI.
Le lien est dans un post en tête du forum API.

Offline

#8 2020-10-13 19:21:29

mrvls
Member
Registered: 2020-10-03
Posts: 18

Re: Search Ticket via PowerShell

J'ai eu de mauvaises expériences avec les modules donc j'évite, malheureusement.
Ceci dit je l'ai ouvert et il m'a été très utile pour comprendre les bases et la méthode d'encoding pour envoyer des données.

LaDenrée wrote:

pour ajouter un suivi (ou n'importe quel objet) il faut utiliser la methode POST
la methode PUT est pour mettre à jour un objet déjà existant

ici le suivi n'existe pas encore, vous ne pouvez donc pas le mettre à jour.

Oui, au temps pour moi, merci. J'avais fini par trouvé, entre les problèmes de syntax d'encoding et de compréhension de ma part... big_smile

Offline

#9 2020-10-13 19:25:13

mrvls
Member
Registered: 2020-10-03
Posts: 18

Re: Search Ticket via PowerShell

Au passage puisque je vous tiens tous les deux.. et je ne vois pas de réponse dans le module ps:

J'ai de petits problèmes pour récupérer les données des tickets issus des formulaires formcreator.
Mon dernier problème, sur un nouveau projet très similaire au premier, a été de gérer les caractères esperluette (&).

Voici comment je récupère le contenu ...

$ticket = Invoke-RestMethod -Uri "$($AppURL)/Ticket/$ticketNumber" -Headers @{"session-token"=$SessionToken.session_token;"App-Token" = "$AppToken"} -Method Get
$html2 = ([System.Web.HttpUtility]::HtmlDecode($ticket.content))

$html2 = "<div>" + ($html2 -replace "&","&amp;") + "</div>"
$fakeXML = [xml]$html2
$fakeXML.ChildNodes.SelectNodes("div")

Je suppose qu'il y a plus propre ?

Last edited by mrvls (2020-10-13 19:25:42)

Offline

#10 2021-03-11 16:51:08

gcorly
Member
Registered: 2021-03-11
Posts: 3

Re: Search Ticket via PowerShell

Bonjour,

le sujet date un peu et il semble que tu n'aies pas eu beaucoup de réponse mais je cherche à récupérer des infos d'un ticket créé via Form Creator pour utiliser un script derrière?.
le but étant de créer des utilisateurs de façon presque automatisée.

je dois gérer powershell moins que toi, et ma connaissance des API est au plus bas.

j'aimerai que nos tech aient juste à renseigner le numéro du ticket.

j'arrive bien à me connecter à l'API, à récupérer le ticket mais je bloque pour la récupération du contenu.

j'ai essayé 2 méthodes, la première, semblable à la tienne, mais pour transformer en xml cela ne fonctionne pas, j'ai un agglomérat de données que je ne peux pas récupérer

$ticket = Invoke-RestMethod -Uri "$($AppURL)/Ticket/30" -Headers @{"session-token"=$SessionToken.session_token;"App-Token" = "$AppToken"}

me renvoie un "content"

content                    : &lt;div&gt;&lt;h1&gt;Donn&eacute;es du formulaire&lt;/h1&gt;&lt;h2&gt;Identit&eacute;&lt;/h2&gt;&lt;div&gt;&lt;b&gt;1) NOM : &lt;/b&gt;TEST&lt;/div&gt;&lt;div&gt;&lt;b&gt;2) Prénom :
                             &lt;/b&gt;Michel&lt;/div&gt;&lt;div&gt;&lt;b&gt;3) Société : &lt;/b&gt;Company&lt;/div&gt;&lt;h2&gt;Mat&eacute;riel&lt;/h2&gt;&lt;div&gt;&lt;b&gt;4) Besoin d'un ordinateur :
                             &lt;/b&gt;NON&lt;/div&gt;&lt;/div&gt; 

Les 2 méthodes me renvoient

h1                    h2                   div
--                    --                   ---
Données du formulaire {Identité, Matériel} {div, div, div, div} 

j'ai donc les en-têtes mais pas les données.. je ne comprends pas pourquoi

Je me suis dit que le soucis venait peut-être du form Creator alors j'ai essayé une autre méthode.

l'autre méthode a été d'interroger directement le 'PluginFormcreatorAnswer' via les commandes suivantes :

$SearchResult = Invoke-RestMethod "$AppURL/PluginFormcreatorAnswer/" -Headers @{"session-token" = $SessionToken.session_token; "App-Token" = "$AppToken" }
$SearchResult.plugin_formcreator_questions_id
$SearchResult.answer 

malheureusement, impossible de choper le "answer" d'un "plugin_formcreator_questions_id" précis dont je pourrai me servir en variable
(je m'y prends peut-être mal)
j'ai l'ensemble des réponses à chaque fois

J'ai aussi seulement un formulaire de test, je ne sais pas trop comment ça se comportera avec plusieurs, peut-être que je pourrai essayer de filtrer par un autre ID (je testerai quand j'aurai réussi déjà à choper ce que je veux)


Bizarrement j'ai l'impression de ne rien trouver sur le net concernant ce besoin d'automatiser des créations d'utilisateur via une récupération d'infos dans un ticket...

Offline

#11 2021-03-12 11:19:02

gcorly
Member
Registered: 2021-03-11
Posts: 3

Re: Search Ticket via PowerShell

[Petit Update]
J'ai aussi avancé de mon côté, en utilisant 'PluginFormcreatorAnswer'.
en récupérant la valeur de '$SearchResult.answer' que je n'arrivais pas à découper, il m'est venu à l'idée de mettre ça dans un Array et du coup les données sont exploitables.

Je vais voir ce que ça donne s'il y a plus de formulaires de réponse et comment je peux filtrer après coup,
je reste toujours à l'écoute de propositions afin d'améliorer mon process smile

Offline

#12 2021-03-12 15:01:08

gcorly
Member
Registered: 2021-03-11
Posts: 3

Re: Search Ticket via PowerShell

Re Update... ça pourra peut-être servir à d'autres du coup.
(moi aussi je parle tout seul)

d'abord, merci à Mrvls et Jean-Christophe pour ce post et le module (idem que Mrvls, je m'en suis juste inspiré)

du coup, pour la partie récupération d'un ticket (créé via un formulaire Form Creator) et récupération des infos dans des variables :
Je vous laisserair modifier avec vos infos d'authentification, modifier les variables, ici, pour mon teste, je voulais juste afficher le résultat des variables mais bien entendu l'idée est de m'en resservir pour un script plus élaboré

$AppURL = "url de l'apirest.php"
$UserToken = "xxxxxxxxxxxxx"
$AppToken = "xxxxxxxxxxxxx"
$SessionToken = Invoke-RestMethod "$AppURL/initSession" -Method Get -Headers @{"Content-Type" = "application/json"; "Authorization" = "user_token $UserToken"; "App-Token" = $AppToken }

$TicketNumber = Read-Host "Entrez le n° de ticket"

$SearchResult = Invoke-RestMethod "$AppURL/Ticket/$TicketNumber/" -Headers @{"session-token" = $SessionToken.session_token; "App-Token" = "$AppToken" }
$html = ([System.Web.HttpUtility]::HtmlDecode($SearchResult.content))
$fakeXML = [xml]$html

Write-Host "-------------------------"
Write-Host "RESULTAT"
Write-Host "-------------------------"

$Name = $fakeXML.ChildNodes.SelectNodes("div")[0].("#text")
$FirstName = $fakeXML.ChildNodes.SelectNodes("div")[1].("#text")
$Agency = $fakeXML.ChildNodes.SelectNodes("div")[2].("#text")
$NeedComputer = $fakeXML.ChildNodes.SelectNodes("div")[3].("#text")

Write-Host "Le nom du nouvel arrivant est $Name"
Write-Host "Son prénom est $FirstName"
Write-Host "Il va travailler à $Agency"
if ($NeedComputer -eq "NON") {
    Write-Host "Pas d'ordinateur demandé pour cet utilisateur"
}
else {
    Write-Host "Un ordinateur a été demandé"
}

Concernant la partie 'PluginFormcreatorAnswer', je n'ai pas encore testé avec de multiples réponses à formulaire, sachant que si je peux utiliser le ticket et son n° cela sera plus simple pour mon besoin.
mais voici ce dont je me suis servi (toujours au cas où ça puisse servir à certains)

$AppURL = "url de l'apirest.php"
$UserToken = "xxxxxxxxxxxxx"
$AppToken = "xxxxxxxxxxxxx"
$SessionToken = Invoke-RestMethod "$AppURL/initSession" -Method Get -Headers @{"Content-Type" = "application/json"; "Authorization" = "user_token $UserToken"; "App-Token" = $AppToken }

$SearchResult = Invoke-RestMethod "$AppURL/PluginFormcreatorAnswer/" -Headers @{"session-token" = $SessionToken.session_token; "App-Token" = "$AppToken" }

Write-Host "Résultat de la réponse au formulaire"
Write-Host "-----------------------------"
$SearchResult.answer
Write-Host "-----------------------------"
Write-Host ""
$Answer = @($SearchResult.answer)
$Name = $Answer[0]
$FirstName = $Answer[1]
$Agency = $Answer[2]
$NeedComputer = $Answer[3]

Write-Host "Le nom du nouvel arrivant est $Name"
Write-Host "Son prénom est $FirstName"
Write-Host "Il va travailler à $Agency"
if ($NeedComputer -eq "NON") {
    Write-Host "Pas d'ordinateur demandé pour cet utilisateur"
}
else {
    Write-Host "Un ordinateur a été demandé"
} 

S'il y a des façon d'améliorer ça, je reste preneur smile

Offline

Board footer

Powered by FluxBB