{"id":594,"date":"2023-07-06T15:38:17","date_gmt":"2023-07-06T14:38:17","guid":{"rendered":"https:\/\/blog.van-daag.nl\/?p=594"},"modified":"2023-08-22T08:17:26","modified_gmt":"2023-08-22T07:17:26","slug":"topdesk-cisco-ise-guest-wifi","status":"publish","type":"post","link":"https:\/\/van-daag.nl\/?p=594","title":{"rendered":"TopDesk &#8211; Cisco ISE Guest Wifi"},"content":{"rendered":"\n<p>We just replaced our network to Cisco with Cisco ISE.<br>We always had a Visitors registration in Topdesk with Wifi code request. Now I needed to make it happen in Cisco ISE.<\/p>\n\n\n\n<p>First we need to get the ID group in Cisco ISE what to use and when.<\/p>\n\n\n\n<p>The script below needs to be running in PowerShell 7 <strong>-SkipCertificateCheck<\/strong><br>If you are running ISE with Certificate you can remove this option and change <strong>&lt;IP ADDESS&gt;<\/strong> to DNS name.<\/p>\n\n\n\n<pre title=\"Get-ISE-IDGroup\" class=\"wp-block-code\"><code lang=\"powershell\" class=\"language-powershell line-numbers\">        $ISEserver = \"&lt;IP ADDRESS&gt;\"\n\n        [int]$ISEport = '9060'\n$Credential = Get-Credential\n        \n\n         $Uri = \"https:\/\/\" + $ISEserver +\":\" + $ISEport + \"\/ers\/config\/endpointgroup\/?size=100\"\n        $Headers = @{\n            'Accept'= \"application\/xml\"\n            'Content-Type'= \"application\/xml\"\n            'ERS-Media-Type'= \"identity.endpointgroup.1.1\"\n            }\n\n\n\n        $Response = Invoke-RestMethod -Uri $Uri -Method \"Get\" -Credential $Credential -SkipCertificateCheck -Headers $Headers \n        $Response.searchResult.resources.resource\n   \n<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"394\" src=\"https:\/\/i0.wp.com\/blog.van-daag.nl\/wp-content\/uploads\/2023\/07\/image.png?resize=640%2C394&#038;ssl=1\" alt=\"\" class=\"wp-image-598\" srcset=\"https:\/\/i0.wp.com\/van-daag.nl\/wp-content\/uploads\/2023\/07\/image.png?w=871&amp;ssl=1 871w, https:\/\/i0.wp.com\/van-daag.nl\/wp-content\/uploads\/2023\/07\/image.png?resize=300%2C185&amp;ssl=1 300w, https:\/\/i0.wp.com\/van-daag.nl\/wp-content\/uploads\/2023\/07\/image.png?resize=768%2C473&amp;ssl=1 768w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/figure>\n\n\n\n<p>Select the Corresponding ID And Save it for later Usage.<\/p>\n\n\n\n<p>Now get the Correct data from the Topdesk SQL database.<br>FYI We changed Topdesk to have the Wifi option there.<\/p>\n\n\n\n<p>Topdesk visitor registration:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"710\" src=\"https:\/\/i0.wp.com\/blog.van-daag.nl\/wp-content\/uploads\/2023\/07\/image-1.png?resize=640%2C710&#038;ssl=1\" alt=\"\" class=\"wp-image-600\" srcset=\"https:\/\/i0.wp.com\/van-daag.nl\/wp-content\/uploads\/2023\/07\/image-1.png?w=682&amp;ssl=1 682w, https:\/\/i0.wp.com\/van-daag.nl\/wp-content\/uploads\/2023\/07\/image-1.png?resize=270%2C300&amp;ssl=1 270w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/figure>\n\n\n\n<p>The SQL query for me was:<br><em>vrijeopzoek1 <\/em> is a long nr what is created when using it.<\/p>\n\n\n\n<p><em>&#8220;SELECT unid,naam,bezoekerbedrijf,verwachteaankomst,verwachtvertrek,identiteitsbewijsid,aanmelderemail,aanmeldernaam,nummer,vrijeopzoek1,aanmeldertelefoon FROM [TOPdesk].[dbo].[bezoeker] where verwachteaankomst &gt;= &#8216;$($vandaagvan)&#8217; and verwachteaankomst &lt;= &#8216;$($vandaagvtot)&#8217; and vrijeopzoek1 in (&#8216;E1532A44-2474-48E0-A540-XXXXXXX&#8217;)&#8221;<\/em><br><br>Below is the Full code that needs to be runned in PowerShell 7<br>Change all the <strong>&lt; TEXT &gt; <\/strong>to the correct output. Edit the HTML Body for nice looking email.<br>At the end, put this script in Task Scheduler every hour and now automatic Wifi accounts are created.<\/p>\n\n\n\n<pre title=\"Full Script\" class=\"wp-block-code\"><code lang=\"powershell\" class=\"language-powershell line-numbers\">Remove-Variable * -ErrorAction SilentlyContinue\n\n$SQLServer = \"&lt;servername&gt;\" \n$SQLDBName = \"&lt;DBNAME&gt;\" \n$User = \"Username\"\n$File = \"Passwordfile.txt\"\n$Credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User, (Get-Content $File | ConvertTo-SecureString)\n$ISEserver = \"&lt;ISESERVER IP&gt;\"\n[int]$ISEport = '9060'\n        $Uri = \"https:\/\/\" + $ISEserver +\":\" + $ISEport + \"\/ers\/config\/guestuser\/\"\n        $Headers = @{\n            'Accept'= \"application\/vnd.com.cisco.ise.identity.guestuser.2.0+xml\"\n            'Content-Type'= \"application\/vnd.com.cisco.ise.identity.guestuser.2.0+xml\"\n            }\n$SmtpClient = New-Object system.net.mail.smtpClient \n$SmtpClient.host = \"&lt;SMTP HOST&gt;\" \n###### Password Generator\nfunction Get-RandomCharacters($length, $characters) {\n    $random = 1..$length | ForEach-Object { Get-Random -Maximum $characters.length }\n    $private:ofs=\"\"\n    return [String]$characters[$random]\n}\n\nfunction Scramble-String([string]$inputString){     \n    $characterArray = $inputString.ToCharArray()   \n    $scrambledStringArray = $characterArray | Get-Random -Count $characterArray.Length     \n    $outputString = -join $scrambledStringArray\n    return $outputString \n}\n\n$vandaagvan = (get-date).tostring(\u201cyyyy-MM-dd HH:mm:ss:fff\u201d)\n\n$vandaagvtot = (get-date).AddHours(+1).tostring(\u201cyyyy-MM-dd HH:mm:ss:fff\u201d)\n\nTry \n{ \n$SQLConnection = New-Object System.Data.SQLClient.SQLConnection \n$SQLConnection.ConnectionString =\"Server = $SQLServer; Database = $SQLDBName; User ID=&lt;DB ID&gt;; Password=&lt;DB PASSWORD&gt;\" \n$SQLConnection.Open() \n} \ncatch \n{ \n    [System.Windows.Forms.MessageBox]::Show(\"Failed to connect SQL Server:\")  \n} \n\n$SQLCommand = New-Object System.Data.SqlClient.SqlCommand \n$SQLCommand.CommandText = \"SELECT unid,naam,bezoekerbedrijf,verwachteaankomst,verwachtvertrek,identiteitsbewijsid,aanmelderemail,aanmeldernaam,nummer,vrijeopzoek1,aanmeldertelefoon FROM [TOPdesk].[dbo].[bezoeker] where verwachteaankomst &gt;= '$($vandaagvan)' and verwachteaankomst &lt;= '$($vandaagvtot)' and vrijeopzoek1 in ('E1532A44-2474-48E0-A540-XXXXXX')\"\n$SQLCommand.Connection = $SQLConnection \n\n$SQLAdapter = New-Object System.Data.SqlClient.SqlDataAdapter \n$SqlAdapter.SelectCommand = $SQLCommand                  \n$SQLDataset = New-Object System.Data.DataSet \n$SqlAdapter.fill($SQLDataset) | out-null\n \n$tablevalue = @() \n\nforeach ($data in $SQLDataset.tables[0]) \n{\n$unid = $data[0] \n$Naam = $data[1]\n$bezoekerbedrijf = $data[2]\n$verwachteaankomst = $data[3].tostring(\u201cMM\\\/dd\\\/yyyy HH:mm\u201d)\n$verwachteaankomstdag = $data[3].tostring(\u201cyyyy\/MM\/dd\u201d)\n$verwachtvertrek = $data[4].tostring(\u201cMM\\\/dd\\\/yyyy HH:mm\u201d)\n$verwachtvertrekdag = $data[4].AddHours( +1 ).tostring(\u201cyyyy\/MM\/dd\u201d)\n$aanmelderemail = $data[6]\n$aanmeldernaam = $data[7]\n$bezoekersTicket = $data[8]\n$wifi = $data[9]\n$aanmelderTel = $data[10]\n$aanmelderTel = $aanmelderTel -replace ' ',''\n\n$ts = New-TimeSpan -Start $verwachteaankomstdag -End $verwachtvertrekdag\n\n\n\n$TotalDays = $ts.Days +1 \n\n\n\n#### GUEST WIFI\nForeach ($account in $Wifi)\n{\n\nIf ($Wifi -eq 'E1532A44-2474-48E0-A540-XXXXXXX')\n{\n\n\nWrite-host GUEST\n$password = Get-RandomCharacters -length 2 -characters 'abcdefghiklmnoprstuvwxyz'\n$password += Get-RandomCharacters -length 2 -characters 'ABCDEFGHKLMNOPRSTUVWXYZ'\n$password += Get-RandomCharacters -length 4 -characters '1234567890'\n#$password += Get-RandomCharacters -length 1 -characters '!\"\u00a7$%&amp;\/()=?}][{@#*+'\n$password = Scramble-String $password\n\n\n$username = Get-RandomCharacters -length 8 -characters 'abcdefghiklmnoprstuvwxyz'\n#$password += Get-RandomCharacters -length 1 -characters 'ABCDEFGHKLMNOPRSTUVWXYZ'\n#$username += Get-RandomCharacters -length 1 -characters '1234567890'\n#$password += Get-RandomCharacters -length 1 -characters '!\"\u00a7$%&amp;\/()=?}][{@#*+'\n$username = Scramble-String $username\n\n\n        $Body = @\"\n&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\n&lt;ns2:guestuser xmlns:ns2=\"identity.ers.ise.cisco.com\"&gt;\n&lt;customFields&gt;\n&lt;\/customFields&gt;\n&lt;guestAccessInfo&gt;\n&lt;fromDate&gt;$verwachteaankomst&lt;\/fromDate&gt;\n&lt;location&gt;&lt;INFO&gt;&lt;\/location&gt;\n&lt;toDate&gt;$verwachtvertrek&lt;\/toDate&gt;\n&lt;validDays&gt;$TotalDays&lt;\/validDays&gt;\n&lt;\/guestAccessInfo&gt;\n&lt;guestInfo&gt;\n&lt;company&gt;$bezoekerbedrijf&lt;\/company&gt;\n&lt;emailAddress&gt;abcfd@nvt.com&lt;\/emailAddress&gt;\n&lt;firstName&gt;$Naam&lt;\/firstName&gt;\n&lt;lastName&gt;na&lt;\/lastName&gt;\n&lt;notificationLanguage&gt;English&lt;\/notificationLanguage&gt;\n&lt;password&gt;$password&lt;\/password&gt;\n&lt;phoneNumber&gt;$aanmelderTel&lt;\/phoneNumber&gt;\n&lt;smsServiceProvider&gt;Global Default&lt;\/smsServiceProvider&gt;\n&lt;userName&gt;$username&lt;\/userName&gt;\n&lt;\/guestInfo&gt;\n&lt;guestType&gt;GUEST&lt;\/guestType&gt;\n&lt;personBeingVisited&gt;$aanmelderemail&lt;\/personBeingVisited&gt;\n&lt;portalId&gt;&lt;PORTAL ID&gt;&lt;\/portalId&gt;\n&lt;reasonForVisit&gt;Requestor $aanmeldernaam&lt;\/reasonForVisit&gt;\n&lt;\/ns2:guestuser&gt;\n\"@\n        $Response = Invoke-RestMethod -Uri $Uri -Method \"Post\" -Credential $Credential -SkipCertificateCheck -Headers $Headers -Body $Body\n        $Response.searchResult.resources.resource\n\n$GuestBody = @\"\n&lt;style&gt;\nh1, h5, th { text-align: center; font-family: Segoe UI; }\n&lt;\/style&gt;\n\n&lt;html&gt;\n    &lt;body&gt;\n    &lt;span lang=NL style='font-size:10.0pt;line-height:106%;color:black'&gt;\nGeachte $aanmeldernaam,&lt;br&gt;\n&lt;br&gt;\nHierbij de Wifi gegevens voor bezoeker $Naam &lt;br&gt;\n\n&lt;br&gt;\nWifi SSID: &lt;b&gt;GUEST&lt;\/b&gt;&lt;br&gt;\nUsername: &lt;b&gt;$username&lt;\/b&gt;&lt;br&gt;\nPassword: &lt;b&gt;$password&lt;\/b&gt;&lt;br&gt;\n&lt;br&gt;\nDeze is geldig tot &lt;b&gt;$verwachtvertrek&lt;\/b&gt;&lt;br&gt;\n\n\n&lt;BR&gt;&lt;BR&gt;\nThis is an autogenerate message from server $env:computername&lt;br&gt;\n&lt;br&gt;\n&lt;\/span&gt;\n\"@\n\n##################\n## Mail config \n##################\n \n$GuestSubject = \"GUEST Wifi Account voor $Naam\"\n$GuestMessage = New-Object system.net.mail.mailmessage \n$GuestMessage.from = \"\"\n$GuestMessage.To.add(\"$aanmelderemail\")  \n$GuestMessage.To.cc(\"\") \n$GuestMessage.Subject = $GuestSubject  \n$GuestMessage.IsBodyHtml = 1\n$GuestMessage.Body = $GuestBody\n \n\n$SmtpClient.Send($GuestMessage)\n\n}\n\n\n}\n}<\/code><\/pre>\n\n\n\n<p>This is an example how the requestor gets the emails.<br><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"346\" height=\"219\" src=\"https:\/\/i0.wp.com\/blog.van-daag.nl\/wp-content\/uploads\/2023\/07\/image-2.png?resize=346%2C219&#038;ssl=1\" alt=\"\" class=\"wp-image-601\" srcset=\"https:\/\/i0.wp.com\/van-daag.nl\/wp-content\/uploads\/2023\/07\/image-2.png?w=346&amp;ssl=1 346w, https:\/\/i0.wp.com\/van-daag.nl\/wp-content\/uploads\/2023\/07\/image-2.png?resize=300%2C190&amp;ssl=1 300w\" sizes=\"auto, (max-width: 346px) 100vw, 346px\" \/><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>We just replaced our network to Cisco with Cisco ISE.We always had a Visitors registration in Topdesk with Wifi code request. Now I needed to make it happen in Cisco ISE. First we need to get the ID group in Cisco ISE what to use and when. The script below needs to be running in [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[53,50,11,49],"tags":[],"class_list":["post-594","post","type-post","status-publish","format-standard","hentry","category-blogs","category-cisco-ise","category-powershell-script","category-topdesk"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/van-daag.nl\/index.php?rest_route=\/wp\/v2\/posts\/594","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/van-daag.nl\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/van-daag.nl\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/van-daag.nl\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/van-daag.nl\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=594"}],"version-history":[{"count":7,"href":"https:\/\/van-daag.nl\/index.php?rest_route=\/wp\/v2\/posts\/594\/revisions"}],"predecessor-version":[{"id":634,"href":"https:\/\/van-daag.nl\/index.php?rest_route=\/wp\/v2\/posts\/594\/revisions\/634"}],"wp:attachment":[{"href":"https:\/\/van-daag.nl\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=594"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/van-daag.nl\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=594"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/van-daag.nl\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=594"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}