Avatar billede Kentoi Seniormester
04. maj 2018 - 10:15 Der er 17 kommentarer

PowerShell: Indhentning af URL fejler.

Jeg forsøger at tilgå en hjemmeside på vores intranet,

$url=Invoke-WebRequest http://intranet.org

men det fejler med:

"Invoke-WebRequest : The remote server returned an error: (401) Unauthorized."

Skal jeg gøre noget specielt for at få det til at virke.
Avatar billede Spotgun Seniormester
04. maj 2018 - 12:49 #1
Det lyder til at jeres intranet kræver et login. Prøv med det her:

$Username = "Username"
$Password = ConvertTo-SecureString -String "Password" -AsPlainText -Force
$Credential = New-Object -TypeName System.Management.Automation.PSCredential($Username, $Password)
$Response = Invoke-WebRequest -Uri "http://intranet.org" -Credential $Credential
Avatar billede Kentoi Seniormester
04. maj 2018 - 13:37 #2
Hold nu fast. Det spillede bare. Nu kommer der så desværre lige et lille ekstra spørgsmål.

Hvordan søger jeg efter indhold og vælger næste element?
Avatar billede Spotgun Seniormester
04. maj 2018 - 13:58 #3
Det afhænger lidt af hvad du vil, men der er flere muligheder. Du kan f.eks. kigge på $Response.AllElements og evt. filtrere på typer af HTML tags, classes eller lignende og hive det information ud du skal bruge der.
Eller du kan lave noget mere reel HTML parsing. Du kan finde lidt inspiration her: https://gallery.technet.microsoft.com/Powershell-Tip-Parsing-49eb8810.

Der er sikkert også andre måder og hvilken én der passer til dit projekt, afhænger helt af hvad du skal have hevet ud af jeres intranet og hvor/hvordan det ligger i HTML'en.
Avatar billede Kentoi Seniormester
04. maj 2018 - 14:19 #4
Sorry, linket virker ikke.
Avatar billede Spotgun Seniormester
04. maj 2018 - 14:28 #5
My bad, fjern punktummet til sidst :)
Avatar billede Kentoi Seniormester
04. maj 2018 - 21:14 #6
Hej Spotgun.
Jeg må lige høre om det ikke er muligt at kunne benytte sig af den bruger og password der allerede er logget ind på computeren, for jeg har ikke nogen problemer med at tilgå min intranet ellers. Kun når jeg forsøger at gøre det på denne her måde skaber det problemer.
Avatar billede Spotgun Seniormester
04. maj 2018 - 22:02 #7
Jo da. Så skal du bare fjerne "-Credential $Credential" og bruge "-UseDefaultCredentials" i stedet. Så logger den på med den bruger der kører PowerShell scriptet. Se evt. dokumentationen for Invoke-WebRequest her: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/invoke-webrequest?view=powershell-6
Avatar billede Kentoi Seniormester
04. maj 2018 - 23:17 #8
Jeg har kigget på dit link med at skulle hente oplysninger fra hjemmeside, men jeg kan ikke få det til at virke. Jeg synes lige meget hvad jeg søger efter får jeg intet retur.


<TD height="100%" class=ms-vb-title onmouseover=OnChildItem(this)><DIV class="ms-vb itx" id=4 onmouseover=OnItem(this) EventType="" Perm="0xb008431061" Field="LinkTitle" CTXName="ctx1254"><A onclick="EditLink2(this,1254);return false;" onfocus=OnLink(this) href="http://share.intranet.org/tools/desktopmanagement/_layouts/listform.aspx?PageType=4&amp;ListId={5696DF31-E236-4F3F-8EE2-90707DADC0EA}&amp;ID=4&amp;ContentTypeID=0x0100FA254EECE740F54DA0D1B9E62EEDBB94" target=_self>Dell Optiplex 7010</A></DIV>
<DIV class=s4-ctx style="HEIGHT: 25px; LEFT: 830px; MARGIN: 0px; LINE-HEIGHT: 25px; TOP: 112px" onmouseover="OnChildItem(this.parentNode); return false;" shown="false"><SPAN>&nbsp;</SPAN><A title="Open Menu" onclick="PopMenuFromChevron(event); return false;" onfocus="OnChildItem(this.parentNode.parentNode); return false;" href="java script:;"><IMG style="VISIBILITY: hidden" alt="Open Menu" src="/_layouts/images/ecbarw.png"></A><SPAN>&nbsp;</SPAN></DIV></TD>


<TD class=ms-vb2>EOL HW</TD>
<TD class=ms-vb2><NOBR>01/07/2012</NOBR></TD>
<TD class="ms-vb2 ms-vb-lastCell"><NOBR>30/07/2017</NOBR></TD>

Jeg er interesseret i at søge på "Dell Optiplex 7010", men skal bruge oplysninger fra en anden "kolonne". Faktisk den 3. kolonne. I det tilfælde 30/07/2017

Er det noget du ville kunne hjælpe mig med?
Avatar billede Kentoi Seniormester
04. maj 2018 - 23:31 #9
<TD class="ms-vb-itmcbx ms-vb-firstCell"><INPUT title="Dell Optiplex 7010&#13;&#10;  " class=s4-itm-cbx type=checkbox value="" _setup="true"></TD>
<TD height="100%" class=ms-vb-title onmouseover=OnChildItem(this)><DIV class="ms-vb itx" id=4 onmouseover=OnItem(this) EventType="" Perm="0xb008431061" Field="LinkTitle" CTXName="ctx1254"><A onclick="EditLink2(this,1254);return false;" onfocus=OnLink(this) href="http://share.intranet.org/tools/desktopmanagement/_layouts/listform.aspx?PageType=4&amp;ListId={5696DF31-E236-4F3F-8EE2-90707DADC0EA}&amp;ID=4&amp;ContentTypeID=0x0100FA254EECE740F54DA0D1B9E62EEDBB94" target=_self>Dell Optiplex 7010</A></DIV>
<DIV class=s4-ctx style="HEIGHT: 25px; LEFT: 830px; MARGIN: 0px; LINE-HEIGHT: 25px; TOP: 112px" onmouseover="OnChildItem(this.parentNode); return false;" shown="false"><SPAN>&nbsp;</SPAN><A title="Open Menu" onclick="PopMenuFromChevron(event); return false;" onfocus="OnChildItem(this.parentNode.parentNode); return false;" href="java script:;"><IMG style="VISIBILITY: hidden" alt="Open Menu" src="/_layouts/images/ecbarw.png"></A><SPAN>&nbsp;</SPAN></DIV></TD>
<TD class=ms-vb2>EOL HW</TD>
<TD class=ms-vb2><NOBR>01/07/2012</NOBR></TD>
<TD class="ms-vb2 ms-vb-lastCell"><NOBR>30/07/2017</NOBR></TD>
Avatar billede Spotgun Seniormester
05. maj 2018 - 01:11 #10
Det kunne garanteret laves væsentligt pænere, men her er en super quick-n-dirty løsning :)

Jeg antager at dine TD's er pakket ind i nogle TR's?

$Response = Invoke-WebRequest -Uri "http://intranet.org" -UseDefaultCredentials
$Rows = $Response.ParsedHtml.getElementsByTagName("TR")
foreach($Row in $Rows) {
    $Cells = $Row.getElementsByTagName("TD")
    if($Cells.Length -ge 4) {
        $PCType = $Cells[0].getElementsByTagName("A")[0].InnerText
        $Date = $Cells[3].getElementsByTagName("NOBR")[0].InnerText
    }
}
Avatar billede Kentoi Seniormester
06. maj 2018 - 23:59 #11
Hej Spotgun.
Din antagelse er korrekt. Dog finder din kode ikke noget brugbart. Jeg sad og så lidt på sourcekoden på intranettet af det jeg kan se, og der er faktisk som udgangspunkt intet er at brugbart at se. Det eneste jeg faktisk kan se er 2 "labels" med tekst "HW Status Approved Models" og en anden "HW Status EOL HW". Jeg kan så trykke på de labels som så udvider sig. Der kommer så en liste af computere, men jeg synes ikke at jeg kan se at sourcing følger med. Det virker som om at det først sker når jeg trykker på teksten, som jeg søger efter. Jeg ser sourcen fordi jeg har trykket F12 i IE. Så jeg er ikke klar over hvor filmen knækker henne.
Avatar billede Spotgun Seniormester
07. maj 2018 - 10:24 #12
Ja, det er jo nok noget dynamisk loadet content så. Det bliver noget sværere at håndtere med Invoke-WebRequest. Prøv evt. at undersøge om jeres intranetløsning udstiller et REST API eller om du kan downloade de data du skal bruge på anden vis (f.eks. som en CVS fil).
Avatar billede Kentoi Seniormester
07. maj 2018 - 11:11 #13
Jeg kan eksportere indholdet til en iqy file, hvilket kan indlæses i excel, som jeg så kan gemme som en CVS fil.

Er der ikke på nogen måder en mulighed i PS at kunne "trykke" på noget af disse ting som udførte en handling?
Avatar billede Spotgun Seniormester
07. maj 2018 - 11:32 #14
Det er sikkert muligt, du kan måske finde noget inspiration her: https://stackoverflow.com/questions/37001886/click-on-button-in-html-page

Hvis du har et link til iqy-filen (eller eksport funktionen), så kan du også downloade filen via Invoke-WebRequest ved at bruge -OutFile parametret. Så kan du altid indlæse filen og parse indholdet bagefter.
Avatar billede Kentoi Seniormester
07. maj 2018 - 21:30 #15
Hej Spotgun
Jeg ved godt at det er way of topic, men hvordan får jeg gennemført et onclick udfra dette:

innerHTML                    : <TD class=ms-gb noWrap colSpan=100><A onclick="java script:ExpCollGroup('7111-2_', 'img_7111-2_',event, false);return false;" href="java script:"><IMG id=img_7111
                              -2_ alt=expand src="/_layouts/images/plus.gif" border=0>&nbsp;HW Status</A> : EOL HW<SPAN style="FONT-WEIGHT: lighter; DISPLAY: inline-block">&nbsp;‎(47) </SPAN
                              ></TD>
innerText                    :  HW Status : EOL HW ‎(47)
outerHTML                    :
                              <TR id=group0><TD class=ms-gb noWrap colSpan=100><A onclick="java script:ExpCollGroup('7111-2_', 'img_7111-2_',event, false);return false;" href="java script:"><I
                              MG id=img_7111-2_ alt=expand src="/_layouts/images/plus.gif" border=0>&nbsp;HW Status</A> : EOL HW<SPAN style="FONT-WEIGHT: lighter; DISPLAY: inline-block">&nbs
                              p;‎(47) </SPAN></TD></TR>
outerText                    :  HW Status : EOL HW ‎(47)

og derefter igen læse webpage igen?
Avatar billede Spotgun Seniormester
08. maj 2018 - 11:23 #16
Det har jeg desværre ikke en løsning til. Det ser ud til at A-tagget har en onclick event, men den har ingen unikke måder at identificere det rigtige tag på, så det bliver svært at parse sig gennem siden, for at finde det rigtige link at trykke på. Jeg ville umiddelbart kigge mig om efter andre muligheder, som nævnt tidligere. Enten en API adgang eller download/eksport af data i stedet for at scrape HTML'en.
Avatar billede Kentoi Seniormester
08. maj 2018 - 16:49 #17
Jeg begynder at se at det er tabt tur, fordi jeg har ikke noget link til eksport funktionen, da den også først bliver tilgænglig når jeg har navigeret mig igennem.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester