[{"content":"This week two critical remote code execution vulnerabilities in PHP itself were disclosed: CVE-2026-109618 and CVE-2026-109619, nicknamed \u0026ldquo;PHP2Shell\u0026rdquo;. These aren\u0026rsquo;t bugs in a plugin or a theme, they\u0026rsquo;re in the PHP core engine, so anything running on PHP (WordPress, Drupal, Joomla and the rest) was potentially exposed. Details leaked before the coordinated release, PHP pushed out emergency patches on 21 October, and there were already reports of active exploitation attempts.\nYes, I patched. But it made me ask a question I\u0026rsquo;d been avoiding for a long time:\nWhy am I still running a PHP server at home for a blog that is essentially an archive?\nA bit of history This blog started life in 2011 as WeakestLync.com, mostly writing up Lync Server 2010 problems as I hit them on customer sites. It followed me through Lync 2013, Skype for Business, Cloud Connector Edition and on to Microsoft Teams and AudioCodes.\nAt one point it was getting over 100,000 unique visitors a year, which still amazes me. A lot of those old Lync and Skype for Business posts are well past their sell-by date, but people still land on them, and I still get the odd message saying a script helped someone out. I don\u0026rsquo;t post very often these days, but I didn\u0026rsquo;t want to lose any of it.\nSo the goal of this migration was simple: preserve the blog, keep every old URL working, and stop it being a security liability.\nThe old setup For the last few years the blog has been self-hosted in my homelab. An Intel N100 mini PC sits on my desk running Proxmox. pfSense acts as my \u0026ldquo;home DMZ\u0026rdquo;, and the site is published to the internet using a Cloudflare Tunnel, so there are no inbound ports open on my home connection.\nThe old setup: WordPress in an LXC container at home, published via a Cloudflare Tunnel\nOn paper it\u0026rsquo;s a nice setup. In reality:\nI rarely logged into WordPress, so plugins and themes were rarely updated I updated the LXC container even less It\u0026rsquo;s a full LAMP-style stack (Debian, PHP, MariaDB, WordPress, plugins, cloudflared) all needing patching, for a site that changes a few times a year pfSense and the tunnel limit the blast radius, but a vulnerability like PHP2Shell is exactly the sort of thing that makes \u0026ldquo;I\u0026rsquo;ll patch it at the weekend\u0026rdquo; a bad plan.\nAttempt #1: January 2023 This isn\u0026rsquo;t the first time I\u0026rsquo;ve tried this. In January 2023 I tried moving to Hugo and hosting on an Azure Static Web App. I used a WordPress plugin to export everything to Markdown, then tried to tidy up the output by hand.\nIt didn\u0026rsquo;t go well:\nImage links were all over the place. Some pointed at the old server IP address from years ago, some at the full https://chrishayward.co.uk/wp-content/... URL, and some at relative paths like ../../../../../uploads/2016/01/image.jpg which broke as soon as Hugo changed the page structure. Special characters. Titles came out with HTML entities like \u0026amp;#8211; instead of dashes. Code blocks. Nearly every script post still had tags from the old Crayon syntax highlighter plugin, like \u0026lt;pre class=\u0026quot;lang:ps decode:true\u0026quot;\u0026gt;, stuck inside the code. Categories and tags were exported in a format Hugo ignored. Fixing 83 posts by hand was never going to happen, so it sat there half-finished for nearly three years. The Static Web App even stayed live, quietly serving a page titled \u0026ldquo;Mainroad\u0026rdquo; (the theme name) to nobody.\nAttempt #2: October 2026, with Claude Code This time I used Claude Code and treated it like a migration project rather than a copy and paste exercise. I gave it the folder with my 2023 attempt, told it the WordPress server was on my network, and asked for a plan first.\nThe whole migration, end to end, in under 2 hours\n1. SSH to the WordPress container Claude Code generated a dedicated SSH key just for the migration, which I added to the container. Small confession: before I\u0026rsquo;d given it a username, it tried a couple of the obvious ones and fail2ban promptly banned my laptop. A slightly embarrassing way to find out my home DMZ was doing its job! We tracked it down to the f2b-SSH iptables chain in the container, removed the ban and carried on.\n2. Export everything Rather than relying on a plugin, it went straight to the source using WP-CLI, which was already on the server:\nwp export --dir=/tmp/blogexp --filename_format=site.wxr.xml wp db export /tmp/blogexp/wordpress-db.sql It copied the wp-content/uploads folder too, along with a full database backup for safe keeping.\n3. Convert to Hugo This is where it earned its keep. Instead of fixing posts by hand it wrote a conversion script, ran it, checked the output, and kept going until everything came across cleanly:\nEvery image link, whether it used the old IP, the full URL or a relative path, now points at /wp-content/uploads/.... Out of 1,633 files in the uploads folder, only 275 were actually needed (WordPress keeps lots of resized copies of every image). 75 code blocks converted to proper fenced code blocks with the right language, so PowerShell and SQL are highlighted properly. Titles and special characters decoded properly. 153 comments and 47 pingbacks kept as read-only threads under each post (without email or IP addresses). Embedded tweets saved as static quotes. Two had since been deleted from X, so those fall back to a link. Every old URL still works: posts are still at /YYYY/MM/DD/post-name/, and old /category/, /tag/ and /feed links redirect to their new equivalents. It then built the site and checked it: all 86 old post and page URLs present, and 0 broken internal links or images.\n4. GitHub and a preview site The output went into my existing GitHub repo on a branch, with a pull request. Azure Static Web Apps automatically builds a preview site for every pull request, so I could click around the whole blog on a temporary URL before anything went live.\nOne gotcha worth sharing: Azure\u0026rsquo;s built-in build system (Oryx) runs on an older Debian image that can\u0026rsquo;t run current versions of Hugo, so the first build failed. The fix is to build Hugo in GitHub Actions and just hand Azure the finished site:\n- name: Install Hugo run: | wget -q -O \u0026#34;$RUNNER_TEMP/hugo.deb\u0026#34; \u0026#34;https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.deb\u0026#34; sudo dpkg -i \u0026#34;$RUNNER_TEMP/hugo.deb\u0026#34; - name: Build site run: hugo --gc - name: Deploy uses: Azure/static-web-apps-deploy@v1 with: azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN }} action: \u0026#34;upload\u0026#34; app_location: \u0026#34;public\u0026#34; skip_app_build: true I also switched to the PaperMod theme, which gives dark mode, search, an archive page and proper SEO tags out of the box.\n5. Go live Once I was happy with the preview I merged the pull request, added chrishayward.co.uk as a custom domain on the Static Web App, and updated DNS in Cloudflare. After Azure validated the domain, a final check against the live site confirmed every old URL was still working.\nThe new setup The new setup: no servers, no PHP, nothing to patch\nThe blog is now just HTML, CSS and images on an Azure Static Web App, on the Free plan. There\u0026rsquo;s no PHP, no database and no admin login page for anyone to brute force. Writing a new post is a Markdown file in GitHub, and every pull request gets its own preview site.\nThe best bit? My WordPress LXC container can now be powered off in Proxmox. One less thing to patch on the N100.\nWas it worth it? Absolutely. Something I\u0026rsquo;d put off for nearly three years was done in an evening. Start to finish, it took under 2 hours, and most of that was me reviewing the preview site and making decisions about the theme.\nA few things I\u0026rsquo;d call out if you\u0026rsquo;re thinking of doing the same:\nUse WP-CLI, not export plugins. The standard WordPress export has everything you need, including comments. Script the conversion. Don\u0026rsquo;t fix posts by hand; fix the script and run it again. Check every old URL. Your old links are what people (and Google) find you by. Use pull request previews. Being able to see the whole site on a temporary URL before going live takes the risk out of it. If you\u0026rsquo;re still running a WordPress site you hardly ever update, PHP2Shell is a good excuse to ask whether it really needs to be dynamic at all.\n","permalink":"https://chrishayward.co.uk/2026/10/22/goodbye-wordpress-hello-hugo/","summary":"\u003cp\u003eThis week two critical remote code execution vulnerabilities in \u003cstrong\u003ePHP itself\u003c/strong\u003e were disclosed: \u003ca href=\"https://thehackernews.com/2026/10/php-issues-emergency-patches-for-two.html\"\u003eCVE-2026-109618 and CVE-2026-109619\u003c/a\u003e, nicknamed \u0026ldquo;PHP2Shell\u0026rdquo;. These aren\u0026rsquo;t bugs in a plugin or a theme, they\u0026rsquo;re in the PHP core engine, so anything running on PHP (WordPress, Drupal, Joomla and the rest) was potentially exposed. Details leaked before the coordinated release, PHP pushed out emergency patches on 21 October, and there were already reports of \u003ca href=\"https://www.wiz.io/blog/php2shell-php-rce\"\u003eactive exploitation attempts\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eYes, I patched. But it made me ask a question I\u0026rsquo;d been avoiding for a long time:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eWhy am I still running a PHP server at home for a blog that is essentially an archive?\u003c/strong\u003e\u003c/p\u003e","title":"Goodbye WordPress: Migrating chrishayward.co.uk to Hugo in under 2 hours with Claude Code"},{"content":"In November 2025 at Ignite, Microsoft announce a new Copilot license for Small and Medium businesses. Microsoft 365 Copilot Business allows organisations with M365 Business licenses (Basis, Standard and Premium) to access M365 Copilot for $21 per month (circa £16 / €18). M365 Business is available to organisations up to 300 users.\nThis is a steal considering non-Enterprise versions of Claude and Chat GPT are $20 per month! You get the added benefit of Copilot being connected to the Microsoft stack and all of your data remaining in the M365 security boundary.\nI eagerly tried to add Microsoft 365 Copilot Business to my M365 tenant and could not find it! What threw me off was the starting at £24.26 per license which is circa $32 and not the $21 announced at Ignite!\nIt turns out it is just another plan under Microsoft 365 Copilot. Click Microsoft 365 Copilot and under plans select Microsoft 365 Copilot Business. It\u0026rsquo;s that simple!\nIn fact, at the time of writing my Tenant has an Up to 15% off Limited Time Offer - Microsoft 365 Copilot Business plan for only £14.49 per month!\n","permalink":"https://chrishayward.co.uk/2025/12/08/how-to-add-microsoft-365-copilot-business-license-to-your-m365-tenant/","summary":"\u003cp\u003eIn November 2025 at Ignite, Microsoft announce a new Copilot license for Small and Medium businesses. \u003ca href=\"https://techcommunity.microsoft.com/blog/microsoft365copilotblog/introducing-microsoft-365-copilot-business-empowering-small-and-medium-businesse/4469700\"\u003eMicrosoft 365 Copilot Business\u003c/a\u003e allows organisations with M365 Business licenses (Basis, Standard and Premium) to access \u003ca href=\"https://www.microsoft.com/en-gb/microsoft-365-copilot\"\u003eM365 Copilot\u003c/a\u003e for \u003cstrong\u003e$21 per month\u003c/strong\u003e (circa £16 / €18). M365 Business is available to organisations \u003cstrong\u003eup to 300 users\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eThis is a steal considering non-Enterprise versions of Claude and Chat GPT are $20 per month! You get the added benefit of Copilot being connected to the Microsoft stack and all of your data remaining in the M365 security boundary.\u003c/p\u003e","title":"How to add Microsoft 365 Copilot Business license to your M365 Tenant"},{"content":"Microsoft announced some Office 365 certificate changes last year: https://learn.microsoft.com/en-us/microsoft-365/compliance/encryption-office-365-tls-certificates-changes?view=o365-worldwide\nIf you\u0026rsquo;re using Microsoft Teams Direct Routing you need to apply a new root certificate to your SBCs. More specifically if your SBC has \u0026ldquo;TLS Mutual Authentication\u0026rdquo; enabled on the Teams SIP interface then you MUST make this change. I would recommend making this change anyway and ASAP!\nHow to check if TLS Mutual Authentication is enabled? Log into your AudioCodes SBC, navigate to Setup \u0026gt; Signalling and Media \u0026gt; Core Entities \u0026gt; SIP Interfaces.\nYou should see an interface named \u0026ldquo;Teams\u0026rdquo; or similar. It could be named something else which you would need to check which \u0026ldquo;SBC IPv4 SIP Interface\u0026rdquo; is assigned to your Teams Proxy set.\nIn the example above, the Teams interface is using the \u0026ldquo;Teams\u0026rdquo; TLS Context and does have TLS Mutual Authentication enabled meaning Direct Routing on this SBC will be impacted when Microsoft change their certificate.\nAnother place to check TLS Mutual Authentication is Setup \u0026gt; Security \u0026gt; Security Settings. There is a global TLS Mutual Authentication setting which is disabled by default.\nHow to upload the new Digicert Root certificate? The first step is to download the Digicert Global Root G2 certificate in PEM format from here https://www.digicert.com/kb/digicert-root-certificates.htm\nYou should check the serial numbers and thumbprints match the Microsoft article here: https://learn.microsoft.com/en-us/microsoft-365/compliance/encryption-office-365-certificate-chains?view=o365-worldwide#digicert-global-root-g2\nOnce you have downloaded the certificate, on your AudioCodes SBC navigate to:\nIP Network \u0026gt; Security \u0026gt; TLS Contexts\nThe TLS Context you need to edit will match the TLS Context assigned to the Teams SIP interface further up the article. In this instance it is named \u0026ldquo;Teams\u0026rdquo;.\nAt this point, it\u0026rsquo;s probably a good idea to review the TLS Context settings. This is out of the scope of this post.\nClick \u0026ldquo;Trusted Root Certificates\u0026rdquo;\nClick \u0026ldquo;Import\u0026rdquo;\nSelect the PEM file downloaded from Digicert and click \u0026ldquo;Open\u0026rdquo;\nCheck the Digicert Global Root G2 is now in the list and double check it\u0026rsquo;s the correct subject, serial number etc.\nFinally click Save (top right) and confirm.\nHow to test the Digicert Root certificate is working? The following post on LinkedIn was brought to my attention https://www.linkedin.com/feed/update/urn:li:activity:7087415295333605376/\nThe interesting part of the post is:\n\u0026ldquo;If you’d like to test and confirm your SBCs certificate configuration prior to the change, Microsoft has prepared a testing endpoint that can be used to verify that SBC appliances trust certificates issued from the new root CA (DigiCert Global Root G2). This endpoint should be used only for SIP OPTIONS ping messages and not for voice traffic. If your SBC can establish a TLS connection to this endpoint, then your connectivity to Teams services should not be affected by the change.\nTest endpoint FQDN: sip.mspki.pstnhub.microsoft.com\nPort: 5061\u0026rdquo;\nThe easiest way to do this is to temporarily add a 4th Proxy Address to your Teams Proxy Set.\nNote - I would recommend this is completed outside of business hours and removed once validated.\nNavigate to Setup \u0026gt; Signalling and Media \u0026gt; Proxy Sets\nSelect your Teams proxy set (It should have 3 proxy addresses sip, sip1, sip2)\nClick \u0026ldquo;Proxy Address 3 items\u0026rdquo;\nBefore continuing just double check that Proxy Load Balancing Method is \u0026ldquo;Random Weights\u0026rdquo; and your Proxy Addresses are configured as follows:\nsip.pstnhub.microsoft.com:5061 - Proxy Priority 1 / Random Weight 1\nsip2.pstnhub.microsoft.com:5061 - Proxy Priority 2 / Random Weight 1\nsip3.pstnhub.microsoft.com:5061 - Proxy Priority 3 / Random Weight 1\nAs long as your Teams Proxy set is setup like this (correctly) you can add a 4th Proxy address (Proxy Priority 4 or higher) as all calls will route to Priority 1 and fail over in order.\nClick New\nProxy Address: sip.mspki.pstnhub.microsoft.com:5061\nTransport Type: TLS\nProxy Priority: 100 (Ensure higher than production proxy addresses)\nProxy Random Weight: 1 (Same as other 3 proxy addresses)\nClick Apply\nNavigate to Monitor \u0026gt; VOIP Status \u0026gt; Proxy Set Status\nFind your Teams Proxy set and you should see the 4th proxy address with a success count \u0026gt; 1 (the counters reset after adding the new address) and Status = Online\nFinally you should connect to the AudioCodes SBC with the Syslog Tool and confirm that the SBC is sending SIP Options and receiving a 200 OK back from the Microsoft IP address associated with the test proxy address. In this example it\u0026rsquo;s 52.112.39.0.\nIf you do not get a 200 OK back it means that there are problems with your SBC config. Note the Proxy Set Status will count any SIP response as a success and online.\nInitially, I tried to just create a new Proxy Set. This showed as online in the Proxy Set Status screen, however a SIP trace showed 403 \u0026ldquo;REASON: Q.850;cause=63;text=\u0026ldquo;465957f3-8c57-4bc0-aa59-4420b270a5ec;SBC certificate is not issued correctly. Provided trunk FQDN \u0026lsquo;x.x.x.x\u0026rsquo; is not included in certificate\u0026rsquo;s CN or SAN list. Certificate allows following FQDNs only: *.mydomain.com, mydomain.com, *.mydomain.com.\u0026rdquo;\u0026rdquo;\nI could have fixed this by creating a new IP Group but then decided the 4th Proxy Address is far easier.\nOnce you have confirmed SIP Options to \u0026amp; from the Microsoft Test address are working, you should remove it from your Teams Proxy Set.\n","permalink":"https://chrishayward.co.uk/2023/07/20/teams-how-to-add-digicert-global-root-g2-root-certificate-to-audiocodes-sbc/","summary":"\u003cp\u003eMicrosoft announced some Office 365 certificate changes last year: \u003ca href=\"https://learn.microsoft.com/en-us/microsoft-365/compliance/encryption-office-365-tls-certificates-changes?view=o365-worldwide\"\u003ehttps://learn.microsoft.com/en-us/microsoft-365/compliance/encryption-office-365-tls-certificates-changes?view=o365-worldwide\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eIf you\u0026rsquo;re using Microsoft Teams Direct Routing you need to apply a new root certificate to your SBCs. More specifically if your SBC has \u0026ldquo;TLS Mutual Authentication\u0026rdquo; enabled on the Teams SIP interface then you MUST make this change. I would recommend making this change anyway and ASAP!\u003c/p\u003e\n\u003ch2 id=\"how-to-check-if-tls-mutual-authentication-is-enabled\"\u003eHow to check if TLS Mutual Authentication is enabled?\u003c/h2\u003e\n\u003cp\u003eLog into your AudioCodes SBC, navigate to \u003cstrong\u003eSetup \u0026gt; Signalling and Media \u0026gt; Core Entities \u0026gt; SIP Interfaces.\u003c/strong\u003e\u003c/p\u003e","title":"Teams – How to add DigiCert Global Root G2 root certificate to AudioCodes SBC"},{"content":"Big shout out to Kieran Lloyd for suggesting this: https://uk.linkedin.com/in/kieranlloyd\nTeams now has a Push To Talk feature on the desktop app by pressing {ctrl} +{ space}. This is a bit like a Walkie Talkie, holding the PTT keys will unmute you then automatically mute you again upon release. https://support.microsoft.com/en-au/office/using-audio-in-teams-17886394-9a9a-4f04-b4cc-e46589408b28\nWhilst discussing Push To Talk, Kieran mentioned he had programmed one of his Logitech Mouse buttons to send {ctrl} + {shift} + M to mute and unmute Teams. He then mentioned he should configure another mouse button to send {ctrl} + {space} to use PTT with his mouse!\nI set out to configure this for my own mouse (Anker Vertical Ergonomic) as it has Next \u0026amp; Previous Page buttons I never use. I soon discovered Windows does not let me program the mouse buttons and Anker do not appear to have software to do this. Kieran was using a Logitech mouse which has software to customise mouse buttons: https://www.logitech.com/en-gb/software/options.html\nAnker Vertical Ergonomic Optical Mouse\nAfter a quick Google Search I stumbled upon a free tool called X-Mouse Button Control https://www.highrez.co.uk/downloads/xmousebuttoncontrol.htm\nOnce installed, I created a new Application Profile for the Microsoft Teams app. This ensures that the custom mouse buttons only send the keyboard keystrokes when Teams is the Active Window (Useful!)\nOnce the new Application profile was created, I was able to identify Mouse Button 4 and 5 were the Previous and Next Page buttons on my mouse as each mouse button highlights orange when pressed.\nFor each button I selected \u0026ldquo;Simulated Keys\u0026rdquo; from the drop down menu.\nMouse Button 4 (Back/Next Page) was programmed as Push To Talk.\nCustom keys = {CTRL}{SPACE}\nHow to send the simulated key strokes = 3 During (Press on down, release on up)\nMouse Button 5 (Forward/Previous Page) was programmed as the standard Mute / Unmute button.\nCustom keys = {CTRL}{SHIFT}M\nHow to send the simulated key strokes = 1 As mouse button is pressed\nThe final configuration looked as follows:\nOnce X-Mouse was configured the buttons worked as expected in the Microsoft Teams app.\n","permalink":"https://chrishayward.co.uk/2022/02/02/microsoft-teams-push-to-talk-via-mouse-button/","summary":"\u003cp\u003eBig shout out to Kieran Lloyd for suggesting this: \u003ca href=\"https://uk.linkedin.com/in/kieranlloyd\"\u003ehttps://uk.linkedin.com/in/kieranlloyd\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eTeams now has a Push To Talk feature on the desktop app by pressing \u003cstrong\u003e{ctrl} +{ space}\u003c/strong\u003e. This is a bit like a Walkie Talkie, holding the PTT keys will unmute you then automatically mute you again upon release. \u003ca href=\"https://support.microsoft.com/en-au/office/using-audio-in-teams-17886394-9a9a-4f04-b4cc-e46589408b28\"\u003ehttps://support.microsoft.com/en-au/office/using-audio-in-teams-17886394-9a9a-4f04-b4cc-e46589408b28\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eWhilst discussing Push To Talk, Kieran mentioned he had programmed one of his Logitech Mouse buttons to send \u003cstrong\u003e{ctrl} + {shift} + M\u003c/strong\u003e to mute and unmute Teams. He then mentioned he should configure another mouse button to send \u003cstrong\u003e{ctrl} + {space}\u003c/strong\u003e to use PTT with his mouse!\u003c/p\u003e","title":"Microsoft Teams – Push To Talk via Mouse Button"},{"content":"The Challenge Microsoft document how to collect Teams log files here: https://docs.microsoft.com/en-us/microsoftteams/log-files\nThe process is fairly simple in Windows 10, right click the Teams icon in the System Tray and click \u0026ldquo;Collect support files\u0026rdquo;\nTeams Collect Support Files\nThis will download a folder to Downloads in Windows where you can open various log files. Unfortunately unlike Lync and Skype for Business, Teams does not have a Snooper application to read log files. By default the files will open in Notepad:\nTeams desktop log in Notepad\nNotepad is ok but it lacks features you would expect in a log file viewer like highlight errors \u0026amp; filter for keywords.\nSolution Fun fact, before I knew anything about UC I had a decent level of knowledge of Microsoft SMS 2003 which then became SCCM. Anyone that knows SMS/SCCM will have spent many hours in log files and used a handy tool called SMS Trace. SMS Trace is part of the SMS 2003 Toolkit but it was actually a really good for reading any log file in Windows.\nAs I write this in 2021 it still works with Windows 10 and makes viewing Teams client logs a little bit easier.\nSMS Trace - Teams client logs\nSMS Trace has the following features by default:\n- Hightlight lines that contain \u0026ldquo;Error\u0026rdquo; or \u0026ldquo;Warning\u0026rdquo; by default\n- Highlight lines that contain a custom string\n- Info pane to view full log entry\n- Filter log file on specific strings of text\nIt\u0026rsquo;s not perfect as it doesn\u0026rsquo;t parse Date/Time, Component etc as it would have done with SMS logs, but it\u0026rsquo;s still much better than a text editor.\nI couldn\u0026rsquo;t find a Microsoft link for the SMS 2003 Toolkit so I\u0026rsquo;ve shared a copy I had here: https://1drv.ms/u/s!Aq7kaZZ6maHyhIc6U-it5W6JY-l24w?e=pebcmN\nWhen installing SMS 2003 Toolkit 2, you only need to install Common Tools which contains SMS Trace.\nSMS Trace Install\nOnce installed, you can run trace32.exe from C:\\Program Files (x86)\\SMS 2003 Toolkit 2\nYou may also want to create a shortcut or make trace32.exe your default application for .log files.\n","permalink":"https://chrishayward.co.uk/2021/09/21/teams-client-log-file-viewer/","summary":"\u003ch2 id=\"the-challenge\"\u003eThe Challenge\u003c/h2\u003e\n\u003cp\u003eMicrosoft document how to collect Teams log files here: \u003ca href=\"https://docs.microsoft.com/en-us/microsoftteams/log-files\"\u003ehttps://docs.microsoft.com/en-us/microsoftteams/log-files\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eThe process is fairly simple in Windows 10, \u003cstrong\u003eright click the Teams icon\u003c/strong\u003e in the \u003cstrong\u003eSystem Tray\u003c/strong\u003e and click \u003cstrong\u003e\u0026ldquo;Collect support files\u0026rdquo;\u003c/strong\u003e\u003c/p\u003e\n\u003cfigure\u003e\u003ca href=\"/wp-content/uploads/2021/09/TeamsCollectSupportFiles.jpg\"\u003e\n    \u003cimg loading=\"lazy\" src=\"/wp-content/uploads/2021/09/TeamsCollectSupportFiles.jpg\"\n         alt=\"Teams Collect Support Files\"/\u003e \u003c/a\u003e\u003cfigcaption\u003e\n            \u003cp\u003eTeams Collect Support Files\u003c/p\u003e\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n\n\u003cp\u003eThis will download a folder to \u003cstrong\u003eDownloads\u003c/strong\u003e in Windows where you can open various log files. Unfortunately unlike Lync and Skype for Business, Teams does not have a Snooper application to read log files. By default the files will open in Notepad:\u003c/p\u003e","title":"Teams – Client Log File Viewer"},{"content":"History Unlike Lync \u0026amp; Skype for Business, Teams doesn\u0026rsquo;t have a method to handle unassigned numbers (yet). There is a UserVoice post here requesting the feature: https://microsoftteams.uservoice.com/forums/555103-public/suggestions/38673550-unassigned-number-range\nTypically the unassigned numbers feature was used to program ALL available number ranges in the system. A number was deemed \u0026ldquo;unassigned\u0026rdquo; if it was not populated as a LineURI against an SfB Object (i.e. User, Response Group, Application Endpoint etc). If an unassigned number received a call you had two options:\nRoute to Exchange UM (I.e. Auto Attendant) Route to an Announcement (i.e. Play a message \u0026ldquo;This number is not in use\u0026rdquo; and optionally redirect to another number like Reception) You could configure an unassigned number action on a per range basis which was useful for international deployments. Other benefits included using 3rd party scripts to report on number allocation/available numbers (by comparing all numbers in use to the numbers programmed in unassigned numbers). When someone leaves the organisation the Unassigned Number range was a handy tool to ensure numbers don\u0026rsquo;t just \u0026ldquo;black hole\u0026rdquo; after IT disable the user.\nWhat about Teams Unassigned Numbers? The short answer is - there isn\u0026rsquo;t an Unassigned Number feature. The good news is I have a method to handle unassigned numbers, although not as feature packed as the SfB feature. This workaround only applies to numbers routing via Direct Routing where you are in control of an SBC. This post involves creating an alternative routing reason to handle 404s from Teams to re-route to an Auto Attendant :)\nPart 1 - Create an Auto Attendant for Unassigned Numbers In this example I will create a Teams Auto Attendant that plays \u0026ldquo;I\u0026rsquo;m sorry this number is not in use\u0026rdquo; then disconnects the call.\nStep 1 - Add a Resource Account via Teams Admin Center\nStep 2 - Grant a Microsoft 365 Phone System - Virtual User license to the Resource Account user using Microsoft 365 Admin Center\nStep 3 - Run PowerShell to assign a Telephone Number to the Resource Account. Note in this example I\u0026rsquo;m using +440000000000 as this number never needs to be reachable from an outside line. You can use a number from a range you hold.\nConnect-MicrosoftTeams Set-CsOnlineApplicationInstance -Identity UnassignedNumber@mydomain.com -OnpremPhoneNumber +440000000000 Step 4 - Create the Auto-Attendant\nStep 5 - Add the Resource Account to the Auto Attendant\nPart 2 - Configure the SBC In this example I will be using AudioCodes. This should be possible on other SBC vendors but the process may differ slightly.\nStep 1 - Create an Alternative Reasons Set with a Release Cause 404 Not Found\nSetup \u0026gt; Signalling \u0026amp; Media \u0026gt; SBC \u0026gt; Routing \u0026gt; Alternative Reasons Set\nStep 2 - Ensure the existing Teams IP Group is configured to use the SBC Alternative Routing Reason Set above\nSetup \u0026gt; Signalling \u0026amp; Media \u0026gt; Core Entities \u0026gt; IP Groups\nStep 3 - Create a new route in the IP-to-IP Routing table. Ensure the rule is directly below your route to Teams and the Alternative Route Options is set to \u0026ldquo;Alternative Route Consider Inputs\u0026rdquo;. The destination should be your Teams IP Group and the \u0026ldquo;Modified Destination User Name\u0026rdquo; should be your Auto Attendant for unassigned numbers.\nSetup \u0026gt; Signalling \u0026amp; Media \u0026gt; SBC \u0026gt; Routing \u0026gt; IP-to-IP Routing\nStep 4 - Ensure the new route is correctly configured below your existing route to Teams\nStep 5 - Test and Trace.\nOn my SBC it attempts to route the call to all three Microsoft SIP endpoints:\nsip.pstnhub.microsoft.com\nsip1.pstnhub.microsoft.com\nsip2.pstnhub.microsoft.com\nThe Alternative Route then kicks in and routes to the Auto Attendant in Teams.\nThis example plays the \u0026ldquo;I\u0026rsquo;m sorry this number is not in use\u0026rdquo; message then disconnects, but this could be another message, redirect to a Switchboard or use other Teams Auto-Attenant features.\nTeams will only send a 404 Not Found back to the SBC if the number is not allocated to a Teams Phone System object (User, Common Area Phone, Resource Account, Teams Room etc). Once the number is allocated, it will no longer hit the alternative route to the Auto Attendant.\n","permalink":"https://chrishayward.co.uk/2021/08/05/microsoft-teams-handle-unassigned-numbers-with-direct-routing/","summary":"\u003ch2 id=\"history\"\u003eHistory\u003c/h2\u003e\n\u003cp\u003eUnlike Lync \u0026amp; Skype for Business, Teams doesn\u0026rsquo;t have a method to handle unassigned numbers (yet). There is a UserVoice post here requesting the feature: \u003ca href=\"https://microsoftteams.uservoice.com/forums/555103-public/suggestions/38673550-unassigned-number-range\"\u003ehttps://microsoftteams.uservoice.com/forums/555103-public/suggestions/38673550-unassigned-number-range\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eTypically the \u003ca href=\"https://docs.microsoft.com/en-us/skypeforbusiness/deploy/deploy-enterprise-voice/create-or-modify-an-unassigned-number-range\"\u003eunassigned numbers feature\u003c/a\u003e was used to program ALL available number ranges in the system. A number was deemed \u0026ldquo;unassigned\u0026rdquo; if it was not populated as a LineURI against an SfB Object (i.e. User, Response Group, Application Endpoint etc). If an unassigned number received a call you had two options:\u003c/p\u003e","title":"Microsoft Teams – Handle unassigned numbers with Direct Routing"},{"content":"When calling a Teams Call Queue, by default it will play the Microsoft default hold music which is same as Response Groups in Lync and Skype for Business.\nOne of the things I always get asked by customers is \u0026ldquo;Can we change that to a normal ringback tone?\u0026rdquo; which you absolutely can. In fact it\u0026rsquo;s now something I ask up front before creating any Call Queues.\nChanging a CQ ringback tone is achieved by changing the CQ hold music. Many countries have slightly different ringback tones, in fact in the UK it can vary slightly from carrier to carrier. However this is my trusty file that\u0026rsquo;s been used for many UK customers over the years.\nUK_ringback_tone.wav\nThe original file and license can be found here: https://commons.wikimedia.org/wiki/File:UK_ringback_tone.ogg\nLcmortensen, CC BY-SA 3.0 https://creativecommons.org/licenses/by-sa/3.0, via Wikimedia Commons.\nThe original .ogg file has been transcoded into WAV format 16 bit, mono, 44100Hz which will work with Lync, Skype for Business and Teams.\nTeams Call Queue hold music can easily be changed via the Teams Admin Centre:\n","permalink":"https://chrishayward.co.uk/2021/04/12/teams-uk-ringback-tone-for-call-queues/","summary":"\u003cp\u003eWhen calling a Teams Call Queue, by default it will play the Microsoft default hold music which is same as Response Groups in Lync and Skype for Business.\u003c/p\u003e\n\u003cp\u003eOne of the things I always get asked by customers is \u0026ldquo;Can we change that to a normal ringback tone?\u0026rdquo; which you absolutely can. In fact it\u0026rsquo;s now something I ask up front before creating any Call Queues.\u003c/p\u003e\n\u003cp\u003eChanging a CQ ringback tone is achieved by changing the CQ hold music. Many countries have slightly different ringback tones, in fact in the UK it can vary slightly from carrier to carrier. However this is my trusty file that\u0026rsquo;s been used for many UK customers over the years.\u003c/p\u003e","title":"Teams – UK Ringback Tone for Call Queues"},{"content":" Enable-TeamsDRUsers GUI\nAt the time of writing it\u0026rsquo;s not possible to enable Teams Direct Routing users via Teams Admin Center, only via PowerShell commands. This PowerShell script launches a WinForms GUI that can be used by anyone. This is useful for enabling or making changes to a couple of Teams DR users.\nRequirements\n- Microsoft Teams PowerShell module 2.0 or above\n- Teams Administrative Rights (Teams Service/Communications Administrator + Skype for Business Administrator)\n- Users must have a Phone System license\nThe script supports very basic Teams settings such as:\n- Change Voice Routing Policy\n- Change Tenant Dial Plan\n- Enable/Disable Enterprise Voice\n- Enable/Disable Hosted Voicemail\n- Set LineURI (Freetext must be prefixed tel: followed by an E164 number)\nAt the time of writing Connect-MicrosoftTeams does not work within WinForms, as a workaround the first time you launch the script it will prompt for credentials straight away. This supports MFA if enabled:\nConnect-MicrosoftTeams authentication.\nThe script has a status box at the top which shows you what actions it is performing. These are also output into the PowerShell command window.\nTo use the script search for a user then click on the user you wish to edit. This will populate the User Settings area with the users current settings. You can then make the relevant changes and click Update to save the changes.\nNote - Even though the script completes, sometimes it takes Teams a few minutes to apply some settings (i.e. Voice Policy and Dial Plan).\nTo remove a LineURI delete the full LineURI including tel:\nEnable-TeamsDRUser - Editing a user\nOnce you have launched the script for the first time you can use the Disconnect button and Connect buttons to change to different Teams Tenants.\nThe latest version of the script can be downloaded from GitHub: https://github.com/cdhayward/Enable-TeamsDRUser\n","permalink":"https://chrishayward.co.uk/2021/03/22/teams-enable-users-for-direct-routing-powershell-gui/","summary":"\u003cfigure\u003e\u003ca href=\"/wp-content/uploads/2021/03/Enable-TeamsDRUser-Launch.jpg\"\u003e\n    \u003cimg loading=\"lazy\" src=\"/wp-content/uploads/2021/03/Enable-TeamsDRUser-Launch.jpg\"\n         alt=\"Enable-TeamsDRUsers GUI\"/\u003e \u003c/a\u003e\u003cfigcaption\u003e\n            \u003cp\u003eEnable-TeamsDRUsers GUI\u003c/p\u003e\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n\n\u003cp\u003eAt the time of writing it\u0026rsquo;s not possible to enable Teams Direct Routing users via Teams Admin Center, only via PowerShell commands. This PowerShell script launches a WinForms GUI that can be used by anyone. This is useful for enabling or making changes to a couple of Teams DR users.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eRequirements\u003c/strong\u003e\u003cbr\u003e\n- Microsoft Teams PowerShell module 2.0 or above\u003cbr\u003e\n- Teams Administrative Rights (Teams Service/Communications Administrator + Skype for Business Administrator)\u003cbr\u003e\n- Users must have a Phone System license\u003c/p\u003e","title":"Teams – Enable users for Direct Routing PowerShell GUI"},{"content":"A very popular Topology for Direct Routing is to deploy a certified Session Border Controller into Microsoft Azure with SIP Trunks to Teams Phone System and SIP Trunks to a PSTN provider. There are Azure Datacentres all over the world, SBCs are rapid to deploy from Marketplace templates and SBC\u0026gt;Teams traffic effectively stays on the Microsoft CDN. Big carriers may have direct peering with Microsofts network, others will meet the Microsoft Network at Internet Exchanges (i.e. LINX in London). There\u0026rsquo;s no need to buy expensive WAN circuits and Compute costs for the SBCs are minimal, especially if on 3 year pricing. It\u0026rsquo;s just an awesome solution!\nTypical Direct Routing architecture in Azure\nI have noticed something and it appears to be getting worse. As soon as you deploy an SBC from the Azure marketplace within hours you will start to see SSH attempts and even SIP call attempts. These must be automated bots looking for insecure services in Azure IP address ranges. It used to take a day or two before you would see this but my last few deployments it\u0026rsquo;s happened within a couple of hours. The screenshots below are from an AudioCodes SBC less than two hours have I deployed the template.\nSSH Attempts\nSIP Call Attempts\nSome SBCs like AudioCodes have an inbuilt Firewall, but this means the SBC itself is doing the heavy lifting. That particular Firewall can also be challenging to configure. Top tip - If you do use the inbuilt Firewall, always configure your Trusted Management rule before adding your default 0.0.0.0 block rule :). There is an alternative option in Azure with Network Security Groups (NSGs). An NSG is a basic Firewall at the network layer in Azure that allows inbound and outbound filtering based on port, source and destination.\nWhen you deploy an AudioCodes SBC from the Azure Marketplace it comes with a default NSG configuration as below (Other vendors may vary slightly).\nAudioCodes default NSG\nAs you can see there are some SSH, HTTP, HTTPS and SIP rules in place already, but they allow any source. This means that anyone on the internet can connect to your SBC on these ports (including those pesky Bots).\nA recommended NSG logically would look like this:\nLogical NSG Diagram\nTraffic is allowed to and from the PSTN Provider, Microsoft Teams and Trusted Management IP addresses. All other traffic is blocked. This is how I typically configure an NSG:\nConfigured NSG\nAs a minimum you should configure the Inbound NSG:\nDisable HTTP, only manage the SBC over SSH and HTTPS which are encrypted\nSpecify source IP Addresses for Management. (i.e Jump Box or your Office/Datacentre public IP)\nConfigure a Teams ACL for SIP and Media. Ensure source ports are locked down to Teams Signalling and Media IPs which are available here. Note the Ports are the local SIP interface and Media Realm on your SBC.\nConfigure a Carrier ACL for SIP and Media. Again the ports reflect what is configured locally on your SBC, ensure the source is your PSTN providers IP addresses (Signalling \u0026amp; Media may be the same or different IPs)\nAt this point if you try to do a Port Scan against your SBC from an untrustred IP address it will appear dead. You will also notice the SSH and SIP attempts stop immediately.\nYou can go even further and set Destination on the NSG to your SBC IP. Certainly with the AudioCodes VE template, the SBC is the only device that lives behind that NSG so not explicitly required. You can of course configure an Outbound NSG to restrict the destinations your SBC can get to if you think that will give you extra security. Don\u0026rsquo;t forget services like NTP!\nFor belt and braces you can also configure the SBC inbuilt Firewall if it has one. I love AudioCodes SBCs but the Firewall isn\u0026rsquo;t for the faint hearted. In my opinion it\u0026rsquo;s better to let the NSG do the heavy lifting and don\u0026rsquo;t even let those packets get to the SBC. I have had customers where their Security Requirements dictated the device Firewall must be configured in addition to the NSG/Perimeter Firewall. This is fine and what they are comfortable with, but I would always ensure in Azure the NSG is configured even if the device has it\u0026rsquo;s own Firewall.\nDisclaimer - I am not a security expert, but I have been around long enough to know when something is completely insecure and the minimum you should do to mitigate those risks. I would always recommend you verify with a Security Consultant that your solution meets the Security Standards for your organisation.\n","permalink":"https://chrishayward.co.uk/2021/03/05/teams-direct-routing-dont-forget-the-nsg-on-your-azure-sbc/","summary":"\u003cp\u003eA very popular Topology for Direct Routing is to deploy a certified Session Border Controller into Microsoft Azure with SIP Trunks to Teams Phone System and SIP Trunks to a PSTN provider. There are Azure Datacentres all over the world, SBCs are rapid to deploy from Marketplace templates and SBC\u0026gt;Teams traffic effectively stays on the Microsoft CDN. Big carriers may have direct peering with Microsofts network, others will meet the Microsoft Network at Internet Exchanges (i.e. LINX in London). There\u0026rsquo;s no need to buy expensive WAN circuits and Compute costs for the SBCs are minimal, especially if on 3 year pricing. It\u0026rsquo;s just an awesome solution!\u003c/p\u003e","title":"Teams Direct Routing – Don't forget the NSG on your Azure SBC!"},{"content":"I am writing this post in January 2021 as all school children in the UK now have to study from home. A friend recently asked me how they can run Microsoft Teams on their kids Amazon Fire Tablet.\nMy immediate thoughts were Teams is not on the Amazon Appstore, Amazon\u0026rsquo;s browser (Silk) is not supported, just install Firefox or Chrome and problem solved. Well it turns out neither Firefox or Chrome are available on the Amazon app store either!\nHow can such a popular device not support Teams? There is an alternative app (Starts with \u0026ldquo;Z\u0026rdquo; and ends with \u0026ldquo;oom\u0026rdquo;) which is available on the Amazon store. However I would like to clear up how you CAN run Microsoft Teams on your Amazon Fire Tablet.\nThe easiest way to install Microsoft Teams is to install Google Play onto your Fire Tablet, you can then sign-in to Google Play with a Google Account and download Microsoft Teams from the Play store.\nThe following two links contain instructions how to install Google Play:\nhttps://www.androidpolice.com/2020/12/25/install-play-store-amazon-fire-tablet/\nhttps://www.howtogeek.com/232726/how-to-install-the-google-play-store-on-your-amazon-fire-tablet/\nOnce the Google Play Store is installed, you will need to sign-in with a Google Account then you can search for and install Microsoft Teams.\nTeams Google Play Store\nHere is Teams installed on my Amazon Fire HD 10 tablet.\nTeams running on Amazon Fire HD 10\n","permalink":"https://chrishayward.co.uk/2021/01/26/how-to-install-microsoft-teams-on-an-amazon-fire-tablet/","summary":"\u003cp\u003eI am writing this post in January 2021 as all school children in the UK now have to study from home. A friend recently asked me how they can run Microsoft Teams on their kids Amazon Fire Tablet.\u003c/p\u003e\n\u003cp\u003eMy immediate thoughts were Teams is not on the Amazon Appstore, Amazon\u0026rsquo;s browser (Silk) is not supported, just install Firefox or Chrome and problem solved. Well it turns out neither Firefox or Chrome are available on the Amazon app store either!\u003c/p\u003e","title":"How To Install Microsoft Teams on an Amazon Fire Tablet"},{"content":"This post explains an easy way to block nuisance callers using an AudioCodes SBC. Whilst it\u0026rsquo;s possible to use New-CsInboundBlockedNumberPattern with Microsoft Teams, what if another type of PBX or Contact Centre hooked up to your SBC? These calls would bypass the Teams rule. Maybe you just want to do your blocking closer to the SIP carrier which is completely acceptable.\nI\u0026rsquo;m achieving this by using AudioCodes Dial Plans which are a super efficient way of routing calls rather than having lots of IP-to-IP rules or Number Manipulations.\nThis post assumes you are knowledgeable about AudioCodes SBCs. Please test this in a lab\nStep 1 - Create a Dial Plan Navigate to Setup \u0026gt; Signalling \u0026amp; Media \u0026gt; SIP Definitions \u0026gt; Dial Plan\nCreate a Dial Plan (If you\u0026rsquo;re already using Dial Plans you can just use the existing one). In my example my SBC has a dial plan \u0026ldquo;TeamsTenants\u0026rdquo; but this can be named anything (i.e. CarrierName)\nClick \u0026ldquo;Dial Plan Rule X items \u0026raquo;\u0026rdquo;\nName = Something descriptive\nPrefix = Full E164 number to block (Assuming your carrier sends everything E164)\nTag = block\nStep 2 - Ensure IP Groups have Dial Plan set Navigate to Setup \u0026gt; Signalling \u0026amp; Media \u0026gt; Core Entities \u0026gt; IP Groups\nEdit the IP Group(s) associated with your SIP carriers. Scroll to the bottom and set Dial Plan to the Dial Plan created in Step 2. Note - You may already have an existing Dial Plan, if this is the case just add the dial plan rules to this dial plan with Tag = block\nStep 3 - Send a 404 if a blocked number tries to call you Navigate to Setup \u0026gt; Signalling \u0026amp; Media \u0026gt; SBC \u0026gt; Routing \u0026gt; IP-to-IP Routing\nClick +New\nName = BlockInbound\nSource IP Group = ANY or Your carrier IP Group\nSource Tag = block\nDestination Type = Internal\nInternal Action = reply(response=\u0026lsquo;404\u0026rsquo;)\nUse the \u0026ldquo;Up\u0026rdquo; arrow to move this rule above your normal SBC number routing. i.e. in my example it\u0026rsquo;s the 3rd rule above my ToTeams routing.\nStep 4 - Test Make an inbound call from a number that is blocked in the dial plan. Using the Syslog Viewer tool you will see a 404 Not Found is sent back to the carrier\nTo block more numbers just add them to the Dial Plan rule and ensure the tag = block\n","permalink":"https://chrishayward.co.uk/2020/12/16/audiocodes-block-nuisance-inbound-calls/","summary":"\u003cp\u003eThis post explains an easy way to block nuisance callers using an AudioCodes SBC. Whilst it\u0026rsquo;s possible to use \u003cstrong\u003eNew-CsInboundBlockedNumberPattern\u003c/strong\u003e with Microsoft Teams, what if another type of PBX or Contact Centre hooked up to your SBC? These calls would bypass the Teams rule. Maybe you just want to do your blocking closer to the SIP carrier which is completely acceptable.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m achieving this by using AudioCodes Dial Plans which are a super efficient way of routing calls rather than having lots of IP-to-IP rules or Number Manipulations.\u003c/p\u003e","title":"AudioCodes – Block nuisance inbound calls"},{"content":"Problem\nWhilst trying to make changes to a Call Queue in Microsoft Teams Admin Center I received the error \u0026ldquo;We can\u0026rsquo;t edit this Call Queue\u0026rdquo;.\nUnfortunately TAC didn\u0026rsquo;t give me any extra information as to why I couldn\u0026rsquo;t Save the CQ.\nA quick search online returned only two posts that were not the solution.\nSolution\nOne of the existing users in the CQ had been disabled for Enterprise Voice. Once I removed that use from the CQ I could save changes via TAC.\nHope this helps, hopefully in future the errors in TAC will be more informative.\n","permalink":"https://chrishayward.co.uk/2020/09/28/microsoft-teams-error-we-cant-edit-this-call-queue/","summary":"\u003cp\u003e\u003cstrong\u003eProblem\u003c/strong\u003e\u003cbr\u003e\nWhilst trying to make changes to a Call Queue in Microsoft Teams Admin Center I received the error \u0026ldquo;We can\u0026rsquo;t edit this Call Queue\u0026rdquo;.\u003c/p\u003e\n\u003cp\u003eUnfortunately TAC didn\u0026rsquo;t give me any extra information as to why I couldn\u0026rsquo;t Save the CQ.\u003c/p\u003e\n\u003cp\u003eA quick search online returned only two posts that were not the solution.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSolution\u003c/strong\u003e\u003cbr\u003e\nOne of the existing users in the CQ had been disabled for Enterprise Voice. Once I removed that use from the CQ I could save changes via TAC.\u003c/p\u003e","title":"Microsoft Teams – \"Error we can't edit this Call Queue\""},{"content":"The Public Preview and Beta modules are useful for testing new features, i.e. managing Private Channel users (Get-TeamChannelUser, Add-TeamChannelUser etc)\nInstalling Beta Module Microsoft documentation used to point you to the poshtestgallery.com to get the module. This has now been replaced by the Preview Module however some MS documentation (i.e. Get-TeamChannelUser) still references Posh Test Gallery.\nGet-TeamChannelUser advises to use PoshTestGallery.\nPoshTestGallery.com\nIf you try to install a module from Posh Test Gallery you will get the following error:\nNo match was found for the specified search criteria and module name\n\u0026lsquo;MicrosoftTeams\u0026rsquo;.\nPoshTestGallery Install-Module -Name MicrosoftTeams ERROR\nIt would appear over the last couple of weeks (August 2020) the MicrosoftTeams module on PoshTestGallery returns a \u0026ldquo;404 - Page not found\u0026rdquo; indicating Microsoft have removed it. The link is still on the home page and is discussed here: https://github.com/PowerShell/PowerShellGallery/issues/119\nPoshTestGallery.com 404 not found\nInstall Public Preview Module Get-TeamChannelUser still advises to install the Beta module from Posh Test Gallery and Add-TeamsChannelUser advises to install the \u0026ldquo;Public Preview\u0026rdquo; version from PowerShell Gallery (I\u0026rsquo;m sure MS are in the process of updating their documentation):\nAdd-TeamChannelUser advises to use PowerShell Public Preview\nYou may get a couple of errors when trying to install the Public Preview module\nInstall-Module : Cannot process argument transformation on parameter \u0026#39;RequiredVersion\u0026#39;. Cannot convert value \u0026#34;1.1.3-preview\u0026#34; to type \u0026#34;System.Version\u0026#34;. Error: \u0026#34;Input string was not in a correct format.\u0026#34; RequiredVersion error\nInstall-Module : A parameter cannot be found that matches parameter name \u0026#39;AllowPreRelease\u0026#39;. AllowPreRelease error\nThe main problem you need to address is AllowPreRelease being missing from Install-Module. This is due to PowerShellGet being out of date on your machine. You would think \u0026ldquo;Update-Module -Name PowerShellGet\u0026rdquo; would resolve, but you just get a different error:\nUpdate-Module : Module \u0026#39;PowerShellGet\u0026#39; was not installed by using Install-Module, so it cannot be updated. To resolve you have to use Install-Module and specify the -Force switch (Also specify repo if you have multiple installed)\nInstall-Module -Name PowerShellGet -Repository PSGallery -Force Once PowerShellGet has been updated, I found I had to open a new PowerShell window before I could install the Teams Preview Module. To install the module run:\nUninstall-Module MicrosoftTeams Install-Module -Name MicrosoftTeams -RequiredVersion 1.1.3-preview -AllowPrerelease Install Teams Preview Module\nIf you run \u0026ldquo;Get-Command -Name \u0026lsquo;*teamchannel*\u0026rsquo; you will see all \u0026ldquo;TeamChannelUser commands are in the Preview Module.\nAll *TeamChannel* commands\n","permalink":"https://chrishayward.co.uk/2020/08/24/microsoft-teams-installing-powershell-preview-beta-modules-manage-private-channels/","summary":"\u003cp\u003eThe Public Preview and Beta modules are useful for testing new features, i.e. managing Private Channel users (Get-TeamChannelUser, Add-TeamChannelUser etc)\u003c/p\u003e\n\u003ch2 id=\"installing-beta-module\"\u003eInstalling Beta Module\u003c/h2\u003e\n\u003cp\u003eMicrosoft documentation used to point you to the poshtestgallery.com to get the module. This has now been replaced by the Preview Module however some MS documentation (i.e. Get-TeamChannelUser) still references Posh Test Gallery.\u003c/p\u003e\n\u003cfigure\u003e\n    \u003cimg loading=\"lazy\" src=\"/wp-content/uploads/2020/08/MS-PoshTestGallery.jpg\"\n         alt=\"Get-TeamChannelUser advises to use PoshTestGallery.\"/\u003e \u003cfigcaption\u003e\n            \u003cp\u003eGet-TeamChannelUser advises to use PoshTestGallery.\u003c/p\u003e\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n\n\u003cfigure\u003e\n    \u003cimg loading=\"lazy\" src=\"/wp-content/uploads/2020/08/PoshTestGallery.jpg\"\n         alt=\"PoshTestGallery.com\"/\u003e \u003cfigcaption\u003e\n            \u003cp\u003ePoshTestGallery.com\u003c/p\u003e\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n\n\u003cp\u003eIf you try to install a module from Posh Test Gallery you will get the following error:\u003c/p\u003e","title":"Microsoft Teams – Installing PowerShell Preview / Beta Modules (Manage Private Channels)"},{"content":"Here are the various errors I encountered helping a customer re-install Cloud Connector Edition and the fixes for them.\nEnabling credential delegation for NTLM on host machine. Enabling credential delegation for NTLM on host machine.\nThe installation hangs whilst running \u0026ldquo;Enabling credential delegation for NTLM on host machine.\u0026rdquo;\nThis fix is actually posted in the Q\u0026amp;A here: https://gallery.technet.microsoft.com/lync/Step-by-Step-Configure-23d8cd42/view/Discussions although the original poster does not confirm if the solution worked. I can confirm it does work.\nTo resolve you need to add the following registry key to the host server which sets CredSSP AllowEncryptionOracle to the \u0026ldquo;vulnerable\u0026rdquo; level. It would be worth removing this registry key after installation\nREG ADD HKLM\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System\\CredSSP\\Parameters /v AllowEncryptionOracle /t REG_DWORD /d 2 Cannot download file 478232_intl_x64_zip.exe This is one of the prerequisites to install Skype for Business server. The download link in CCE is invalid, so you may see the error where it fails to download or if you miss that you will see the error when it tries to copy files into the Virtual Machines. Fix is here:\nhttps://github.com/MicrosoftDocs/OfficeDocs-SkypeForBusiness/issues/1606\nYou need to download 478232_intl_x64_zip.exe manually and place in the \\SiteDirectory\\Bits\\KB2982006 folder. Someone above has kindly provided a link to the file.\nWARNING: Set-CsCertificate failed. This is again documented here https://erwinbierens.com/cloud-connector-edition-upgrade-issues/, but the fix of using an older version of CCE did not work.\nThe Set-CsCertificate error is actually because the SfB bootstrapper fails when installing SQL. If you scroll up the PowerShell window you will see the SQL error documented by Erwin:\n\u0026ldquo;Checking prerequisite SqlUpgradeInstanceRtcLocal\u0026hellip;prerequisite satisfied. Installing SQLEXPR_x64.exe(/Q /IACCEPTSQLSERVERLICENSETERMS /UPDATEENABLED=0 /HIDECONSOLE /ACTION=Install /FEATURES=SQL Engine,Tools /INSTANCENAME=RTCLOCAL /TCPENABLED=1 /SQLSVCACCOUNT=\u0026ldquo;NT AUTHORITY\\NetworkService\u0026rdquo; /SQLSYSADMINACCOUNTS=\u0026ldquo;Bu iltin\\Administrators\u0026rdquo; /BROWSERSVCSTARTUPTYPE=\u0026ldquo;Automatic\u0026rdquo; /AGTSVCACCOUNT=\u0026ldquo;NT AUTHORITY\\NetworkService\u0026rdquo; /SQLSVCSTARTUPTYP E=Automatic)\u0026hellip;failure code -2068774911\u0026rdquo;\nIf you log onto the Edge and check out the Bootstrap-CsMachine HTML file it\u0026rsquo;s essentially the same error as above and tells you to check the SQL logs. If you check the SQL logs you will see the following error:\n\u0026ldquo;SQL Server Setup Error - There was an error generating the XML document. Error code 0x84B10001.\u0026rdquo;\nIf you do some digging you will find posts like this: https://www.mssqltips.com/sqlservertip/4276/sql-server-setup-error\u0026ndash;there-was-an-error-generating-the-xml-document-error-code-0x84b10001/ which indicate some other issue with permissions (Maybe CredSSP again?)\nThere\u0026rsquo;s some other posts like this which backup the theory: https://social.msdn.microsoft.com/Forums/sqlserver/en-US/8859a3ff-dfa2-48f4-b992-84778f308a84/install-sql-2012-remotely-with-powershell?forum=sqlsetupandupgrade\nThis error is also discussed here: https://www.microsoftpartnercommunity.com/t5/Products-Discussions/Skype-for-Business-Cloud-Connector-installation-issues/td-p/2559\nOne person mentions on their 5th install attempt it worked Quote \u0026ldquo;In effect no - but after about 5 attempts to install the appliance (without making any changes, other than deleteing the failed VMs each time), it worked. I cant explain why!\u0026rdquo;\nI can say after 8+ attempts I didn\u0026rsquo;t have such luck! Here is my fix:\nOn the CCE Host edit C:\\Program Files\\WindowsPowerShell\\Modules\\CloudConnector\\Internal\\SfBServer.ps1 in PowerShell ISE\nJust before the /BootStrapCore lines (line 68) add a Read-Host to pause the script\nSfBServer.ps1 is used to install the Mediation and Edge servers, Med server is first. So the first time you see the script pause with your Read-Host message, you can skip it and the Mediation Server should install successfully.\nThe second time the script pauses, it will be building the Edge server \u0026ldquo;DO NOT PRESS ANYTHING\u0026rdquo;.\nLog into the Edge server as the Domain Administrator, open CMD and CD to the SfB installation folder, I haven\u0026rsquo;t got the exact path I think it was:\nC:\\CloudConnector\\SfbBits\\Setup\\amd64\\\nIn this directory should be the SfB install media (i.e.Setup.exe / setup2.exe)\nRun the bootstrapper to install SfB core components:\nsetup.exe /BootStrapCore\nOnce complete, run the second bootstrapper command to import configuration, install SQL etc:\nsetup.exe /BootStrapLocalMgmt\nSQL should successfully install. Return to the CCE installation script and resume, it will run both bootstrapper commands again, but as you have already ran them manually it will skip through quickly.\nThat\u0026rsquo;s it problem solved!\nFinal Thoughts Skype for Business Cloud Connector Edition is an awful product and hasn\u0026rsquo;t been updated since 2018. With Skype for Business Online being retired on 31st July 2021, the best option is to move to Teams and Direct Routing ASAP. Direct Routing is significantly better than CCE, it is just a TLS SIP Trunk into Microsoft. Nice and simple.\nWhilst troubleshooting this I was thinking \u0026ldquo;Why didn\u0026rsquo;t Microsoft allow you to run the CCE in stages, why is it one big script that takes an hour to run and if it fails you have to start again?\u0026rdquo;\nSurprisingly CCE sort of does have this: https://docs.microsoft.com/en-us/skypeforbusiness/skype-for-business-hybrid-solutions/plan-your-phone-system-cloud-pbx-solution/install-ccappliance\nYou can run install-ccappliance with -ShowStepsOnly, -Steps and -SkipExistingObjects.\nI can confirm that the -ShowStepsOnly works but if you try to run specific Steps using \u0026ldquo;-steps\u0026rdquo; the first thing Install-CCAppliance does is delete the 4 VMs - LOL! Useless.\n","permalink":"https://chrishayward.co.uk/2020/07/26/skype-for-business-cce-install-problems/","summary":"\u003cp\u003eHere are the various errors I encountered helping a customer re-install Cloud Connector Edition and the fixes for them.\u003c/p\u003e\n\u003ch2 id=\"enabling-credential-delegation-for-ntlm-on-host-machine\"\u003eEnabling credential delegation for NTLM on host machine.\u003c/h2\u003e\n\u003cfigure\u003e\n    \u003cimg loading=\"lazy\" src=\"/wp-content/uploads/2020/07/CCE-Delegation-for-NTLM.jpg\"\n         alt=\"Enabling credential delegation for NTLM on host machine.\"/\u003e \u003cfigcaption\u003e\n            \u003cp\u003eEnabling credential delegation for NTLM on host machine.\u003c/p\u003e\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n\n\u003cp\u003eThe installation hangs whilst running \u0026ldquo;Enabling credential delegation for NTLM on host machine.\u0026rdquo;\u003c/p\u003e\n\u003cp\u003eThis fix is actually posted in the Q\u0026amp;A here: \u003ca href=\"https://gallery.technet.microsoft.com/lync/Step-by-Step-Configure-23d8cd42/view/Discussions\"\u003ehttps://gallery.technet.microsoft.com/lync/Step-by-Step-Configure-23d8cd42/view/Discussions\u003c/a\u003e although the original poster does not confirm if the solution worked. I can confirm it does work.\u003c/p\u003e","title":"Skype for Business – CCE Install Problems"},{"content":"I keep seeing posts for fun backgrounds from various brands so I decided to keep a list together here.\nWhilst you can just search Google Images, you may not necessarily have rights to use the image.\nI will try to keep this list up to date with official links to Video Conference backgrounds from our favorite brands.\nBBCIncluding:\n'Allo 'Allo!\nBlackadder\nBlue Peter\nDads Army\nDoctor Who\nEastEnders\nFawlty Towers\nMatch of the Day\nOnly Fools and Horses\nPorridge\nStrictly Come Dancing\nTop of the Pops\nTweenies\nYes Minister\nhttps://www.bbc.co.uk/archive/empty_sets_collection/zfvy382\nDisney\nPixar\nhttps://news.disney.com/pixar-video-backgrounds-available\nDisney Princess\nhttps://news.disney.com/princess-video-backgrounds\nDisney Theme Parks\nhttps://disneyparks.disney.go.com/blog/2020/04/disneymagicmoments-add-disney-magic-to-online-video-chats-with-virtual-backgrounds/\nFoxIncluding:\nFamily Guy\nThe Simpsons\nhttps://www.fox.com/animation-domination/download-zoom-backgrounds/\nIKEAIncluding:\nOffices\nCelebrations\nWith a view\nRomantic date\nSpaces\nhttps://backgroundsbyikea.com/ITVCoronation Street\nhttps://www.itv.com/coronationstreet/articles/free-backgrounds-online-meetings-video-callsLegohttps://www.lego.com/en-gb/themes/letsbuildtogether/backgrounds\nMarvelhttps://www.marvel.com/articles/culture-lifestyle/video-call-backgrounds\nStar Warshttps://www.starwars.com/news/star-wars-backgrounds\nTransport for Londonhttps://londonblog.tfl.gov.uk/2020/05/01/video-conference-backgrounds/ How to add a custom background to Teams?\nTeams PC Windows\nSave file to %APPDATA%\\Microsoft\\Teams\\Backgrounds\\Uploads\nTeams MAC OS\nSave file to ~/Library/Application Support/Microsoft/Teams/Backgrounds/Uploads\nHow to add a custom background to Zoom?\nZoom\nOpen Settings \u0026gt; \u0026ldquo;Virtual Background\u0026rdquo;.\n","permalink":"https://chrishayward.co.uk/2020/05/20/microsoft-teams-and-zoom-official-fun-custom-backgrounds/","summary":"\u003cp\u003eI keep seeing posts for fun backgrounds from various brands so I decided to keep a list together here.\u003c/p\u003e\n\u003cp\u003eWhilst you can just search Google Images, you may not necessarily have rights to use the image.\u003c/p\u003e\n\u003cp\u003eI will try to keep this list up to date with official links to Video Conference backgrounds from our favorite brands.\u003c/p\u003e\n\u003ctable\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003e\u003cstrong\u003eBBC\u003c/strong\u003e\u003c/td\u003e\u003ctd\u003eIncluding:\u003cbr\u003e\u003cbr\u003e'Allo 'Allo!\u003cbr\u003eBlackadder\u003cbr\u003eBlue Peter\u003cbr\u003eDads Army\u003cbr\u003eDoctor Who\u003cbr\u003eEastEnders\u003cbr\u003eFawlty Towers\u003cbr\u003eMatch of the Day\u003cbr\u003eOnly Fools and Horses\u003cbr\u003ePorridge\u003cbr\u003eStrictly Come Dancing\u003cbr\u003eTop of the Pops\u003cbr\u003eTweenies\u003cbr\u003eYes Minister\u003cbr\u003e\u003cbr\u003e\u003cbr\u003e\u003ca href=\"https://www.bbc.co.uk/archive/empty_sets_collection/zfvy382\" target=\"_blank\" rel=\"noreferrer noopener\"\u003ehttps://www.bbc.co.uk/archive/empty_sets_collection/zfvy382\u003c/a\u003e\u003cbr\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003cstrong\u003eDisney\u003c/strong\u003e\u003cbr\u003e\u003cbr\u003e\u003cbr\u003e\u003cbr\u003e\u003cbr\u003e\u003cbr\u003e\u003c/td\u003e\u003ctd\u003ePixar\u003cbr\u003e\u003ca href=\"https://news.disney.com/pixar-video-backgrounds-available\" target=\"_blank\" rel=\"noreferrer noopener\"\u003ehttps://news.disney.com/pixar-video-backgrounds-available\u003c/a\u003e\u003cbr\u003e\u003cbr\u003eDisney Princess\u003cbr\u003e\u003ca href=\"https://news.disney.com/princess-video-backgrounds\" target=\"_blank\" rel=\"noreferrer noopener\"\u003ehttps://news.disney.com/princess-video-backgrounds\u003c/a\u003e\u003cbr\u003e\u003cbr\u003eDisney Theme Parks\u003cbr\u003e\u003ca href=\"https://disneyparks.disney.go.com/blog/2020/04/disneymagicmoments-add-disney-magic-to-online-video-chats-with-virtual-backgrounds/\" target=\"_blank\" rel=\"noreferrer noopener\"\u003ehttps://disneyparks.disney.go.com/blog/2020/04/disneymagicmoments-add-disney-magic-to-online-video-chats-with-virtual-backgrounds/\u003c/a\u003e\u003cbr\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003cstrong\u003eFox\u003c/strong\u003e\u003c/td\u003e\u003ctd\u003eIncluding:\u003cbr\u003e\u003cbr\u003eFamily Guy\u003cbr\u003eThe Simpsons\u003cbr\u003e\u003cbr\u003e\u003ca href=\"https://www.fox.com/animation-domination/download-zoom-backgrounds/\" target=\"_blank\" rel=\"noreferrer noopener\"\u003ehttps://www.fox.com/animation-domination/download-zoom-backgrounds/\u003c/a\u003e\u003cbr\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003cstrong\u003eIKEA\u003c/strong\u003e\u003c/td\u003e\u003ctd\u003eIncluding:\u003cbr\u003e\u003cbr\u003eOffices\u003cbr\u003eCelebrations\u003cbr\u003eWith a view\u003cbr\u003eRomantic date\u003cbr\u003eSpaces\u003cbr\u003e\u003cbr\u003e\u003ca href=\"https://backgroundsbyikea.com/\" target=\"_blank\" rel=\"noreferrer noopener\"\u003ehttps://backgroundsbyikea.com/\u003c/a\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003cstrong\u003eITV\u003c/strong\u003e\u003c/td\u003e\u003ctd\u003eCoronation Street\u003cbr\u003e\u003cbr\u003e\u003ca href=\"https://www.itv.com/coronationstreet/articles/free-backgrounds-online-meetings-video-calls\"\u003ehttps://www.itv.com/coronationstreet/articles/free-backgrounds-online-meetings-video-calls\u003c/a\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003cstrong\u003eLego\u003c/strong\u003e\u003c/td\u003e\u003ctd\u003e\u003ca rel=\"noreferrer noopener\" href=\"https://www.lego.com/en-gb/themes/letsbuildtogether/backgrounds\" target=\"_blank\"\u003ehttps://www.lego.com/en-gb/themes/letsbuildtogether/backgrounds\u003c/a\u003e\u003cbr\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003cstrong\u003eMarvel\u003c/strong\u003e\u003c/td\u003e\u003ctd\u003e\u003ca href=\"https://www.marvel.com/articles/culture-lifestyle/video-call-backgrounds\"\u003ehttps://www.marvel.com/articles/culture-lifestyle/video-call-backgrounds\u003c/a\u003e\u003cbr\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003cstrong\u003eStar Wars\u003c/strong\u003e\u003c/td\u003e\u003ctd\u003e\u003ca rel=\"noreferrer noopener\" href=\"https://www.starwars.com/news/star-wars-backgrounds\" target=\"_blank\"\u003ehttps://www.starwars.com/news/star-wars-backgrounds\u003c/a\u003e\u003cbr\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e\u003cstrong\u003eTransport for London\u003c/strong\u003e\u003c/td\u003e\u003ctd\u003e\u003ca href=\"https://londonblog.tfl.gov.uk/2020/05/01/video-conference-backgrounds/\" target=\"_blank\" rel=\"noreferrer noopener\"\u003ehttps://londonblog.tfl.gov.uk/2020/05/01/video-conference-backgrounds/\u003c/a\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\n\u003cp\u003eHow to add a custom background to Teams?\u003c/p\u003e","title":"Microsoft Teams [and Zoom] – Official \"FUN\" Custom Backgrounds"},{"content":"You may notice that your Skype for Business Front End server consumes a lot of disk space and the culprit will either be:\nC:\\ProgramData\\Windows Fabric\\Log (SfB 2015)\nor\nC:\\ProgramData\\Microsoft\\SF\\Log (SfB 2019)\nThis is caused by Windows Fabric log growth and can be rectified by either:\nIncrease disk space Limit how long Fabric Logs are kept (default 3 days) This post shows how to do option 2 manually in SfB 2015: https://myhybridsetup.org/skype-for-business-2015-limit-fabric-tracing-logs-growth/\nThe post above is still valid for SfB 2019, except the ‘ClusterManifest.Xml.Template’ is in a slightly different path: C:\\Program Files\\Skype for Business Server 2019\\Server\\Core (Quite obvious) and the Fabric Logs have moved to: C:\\ProgramData\\Microsoft\\SF\\Log\nYou can implement the same fix manually, or I have a script a colleague created to do this for you.\nDisclaimer: Do not run this on a prod environment without first testing yourself.\n$ver = Get-CsServerVersion # Get Fabric Template Config files $file = “C:\\Program Files\\Skype for Business Server $($ver.Substring(26,4))\\Server\\Core\\ClusterManifest.Xml.Template\u0026#34; # Copy and rename files incase of issues Copy-Item -Path $file -Destination “$($file).old\u0026#34; # Replace 3days with 1 day (Get-Content $file)|foreach {$_ -Replace \u0026#39;Name=\u0026#34;DataDeletionAgeInDays\u0026#34; Value=\u0026#34;3\u0026#34;\u0026#39;,\u0026#39;Name=\u0026#34;DataDeletionAgeInDays\u0026#34; Value=\u0026#34;1\u0026#34;\u0026#39;}|out-file $file -Force # Delete logs SfB 2015 If (test-path -Path \u0026#34;C:\\ProgramData\\Windows Fabric\\Log\u0026#34; -ErrorAction SilentlyContinue){Get-ChildItem \u0026#34;C:\\ProgramData\\Windows Fabric\\Log\u0026#34;-Recurse |where {$_.name -like \u0026#34;*.etl\u0026#34; -or $_.name -like \u0026#34;*.blg\u0026#34;}|Remove-Item -Force -ErrorAction SilentlyContinue} # Delete logs SfB 2019 elseif (Test-Path -Path \u0026#34;C:\\ProgramData\\Microsoft\\SF\\Log\u0026#34; -ErrorAction SilentlyContinue){ Get-ChildItem \u0026#34;C:\\ProgramData\\Microsoft\\SF\\Log\u0026#34; -Recurse |where {$_.name -like \u0026#34;*.etl\u0026#34; -or $_.name -like \u0026#34;*.blg\u0026#34;}|Remove-Item -Force -ErrorAction SilentlyContinue} Write-Host \u0026#34;Restart Front End Services Manually\u0026#34; -ForegroundColor Yellow The script is doing a couple of things:\nGet SfB Version to work out where ClusterManifest.xml.Template file \u0026amp; Fabric Logs may be (Assumes SfB has been installed on the C: drive!) Take a backup of ClusterManifest.xml.Template Perform a find and replace in ClusterManifest.xml.Template to set DataDeletionAgeInDays to 1 rather than 3 Delete all SfB 2015 Fabric Logs Delete all SfB 2019 Fabric Logs Prompt you to restart Front End services When we deploy SfB, we run this script on all servers on an FE pool to keep Fabric Logs/Traces to a minimum.\nWARNING - It\u0026rsquo;s not clear if this is supported by Microsoft or whether future updates/CUs overwrite ClusterManifest.Xml.Template.\n","permalink":"https://chrishayward.co.uk/2020/04/30/skype-for-business-server-fabric-logs-consuming-disk-space-script/","summary":"\u003cp\u003eYou may notice that your Skype for Business Front End server consumes a lot of disk space and the culprit will either be:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eC:\\ProgramData\\Windows Fabric\\Log (SfB 2015)\u003c/strong\u003e\u003cbr\u003e\nor\u003cbr\u003e\n\u003cstrong\u003eC:\\ProgramData\\Microsoft\\SF\\Log (SfB 2019)\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eThis is caused by Windows Fabric log growth and can be rectified by either:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eIncrease disk space\u003c/li\u003e\n\u003cli\u003eLimit how long Fabric Logs are kept (default 3 days)\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eThis post shows how to do option 2 manually in SfB 2015: \u003ca href=\"https://myhybridsetup.org/skype-for-business-2015-limit-fabric-tracing-logs-growth/\"\u003ehttps://myhybridsetup.org/skype-for-business-2015-limit-fabric-tracing-logs-growth/\u003c/a\u003e\u003c/p\u003e","title":"Skype for Business Server – Fabric Logs Consuming Disk Space (Script)"},{"content":"Microsoft have stated that they would retire Exchange Online UM on 28th February 2020 and it would be replaced by Cloud Voicemail. https://docs.microsoft.com/en-us/skypeforbusiness/plan/exchange-unified-messaging-online-migration-support\nThis morning at 2:51am (29th Feb) we received the following email from Office 365 Message Centre.\nEnsure you have configured the Cloud Voicemail prereqs. https://docs.microsoft.com/en-us/skypeforbusiness/hybrid/plan-cloud-voicemail. One of the main requirements is a SfB Hybrid which was not required for Exchange Online UM integration. It\u0026rsquo;s still not clear what has happened to customers who have not done this. Does CVM work without a Hybrid?\nAs per the email above you will need to migate your EXUM Auto Attendants ro Cloud Auto Attendants by end of March: https://docs.microsoft.com/en-us/skypeforbusiness/hybrid/plan-cloud-auto-attendant\n","permalink":"https://chrishayward.co.uk/2020/02/29/skype-for-business-rip-exchange-um/","summary":"\u003cp\u003eMicrosoft have stated that they would retire Exchange Online UM on 28th February 2020 and it would be replaced by Cloud Voicemail. \u003ca href=\"https://docs.microsoft.com/en-us/skypeforbusiness/plan/exchange-unified-messaging-online-migration-support\"\u003ehttps://docs.microsoft.com/en-us/skypeforbusiness/plan/exchange-unified-messaging-online-migration-support\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eThis morning at 2:51am (29th Feb) we received the following email from Office 365 Message Centre.\u003c/p\u003e\n\u003cfigure\u003e\n    \u003cimg loading=\"lazy\" src=\"/wp-content/uploads/2020/02/Screenshot_20200229-065550_Outlook-1-1011x1024.jpg\"/\u003e \n\u003c/figure\u003e\n\n\u003cfigure\u003e\n    \u003cimg loading=\"lazy\" src=\"/wp-content/uploads/2020/02/Screenshot_20200229-065603_Outlook-1024x737.jpg\"/\u003e \n\u003c/figure\u003e\n\n\u003cfigure\u003e\n    \u003cimg loading=\"lazy\" src=\"/wp-content/uploads/2020/02/Screenshot_20200229-065620_Outlook-829x1024.jpg\"/\u003e \n\u003c/figure\u003e\n\n\u003cp\u003eEnsure you have configured the Cloud Voicemail prereqs. \u003ca href=\"https://docs.microsoft.com/en-us/skypeforbusiness/hybrid/plan-cloud-voicemail\"\u003ehttps://docs.microsoft.com/en-us/skypeforbusiness/hybrid/plan-cloud-voicemail\u003c/a\u003e. One of the main requirements is a SfB Hybrid which was not required for Exchange Online UM integration. It\u0026rsquo;s still not clear what has happened to customers who have not done this. Does CVM work without a Hybrid?\u003c/p\u003e","title":"Skype for Business – RIP Exchange Unified Messaging"},{"content":"To configure Cloud Voicemail, you should follow this guide from Microsoft: https://docs.microsoft.com/en-us/skypeforbusiness/hybrid/configure-cloud-voicemail\nBefore I started writing this post, I knew that -Tenant should be -TenantID in SfBs 2019 (TenantID = Your Office 365 TenantID). I have successfully configured customers with CVM using this method. When trying to get a screenshot from a working environment -TenantID was missing! Doing some further investigation it looks like the latest SfBs 2019 CU removes -TenantID (and even -Tenant) from the Set/New-CsHostedVoicemailPolicy cmdlet.\nThese are the errors you get on the latest SfBs 2019 CU:\nA parameter cannot be found that matches parameter name \u0026lsquo;Tenant\u0026rsquo;.\nA parameter cannot be found that matches parameter name \u0026lsquo;TenantID\u0026rsquo;.\nSfBs 2019 RTM TenantID is available\u0026hellip;\u0026hellip;..\nThis is a working SfBs 2019 CVM customer with the latest December CU installed and TenantID is missing!\nIf I do a select * I can see the \u0026quot;TenantID\u0026quot; is still populated in Element from when I did the original config.\nThe Microsoft article still says:\n\u0026ldquo;To modify the global policy, run the following command in the Skype for Business Server management shell after updating your Organization and TenantID:\u0026rdquo;\n-Tenant is used in the example command\nI\u0026rsquo;m at a complete loss, is this still required? Should it be -Tenant or -TenantID?\nLooking at these cmdlets on different SfBs versions New-CsHostedVoicemailPolicy / Set-CsHostedVoicemailPolicy\nSfBs 2015 Latest CU Only has -Tenant\nSfBs 2019 RTM Has -Tenant and -TenantID\nSfBs 2019 Latest CU Doesn\u0026rsquo;t have -Tenant or -TenantID\nMy understanding is as follows (Only because I have experience with Lync 2013 Hosting Pack 2 and one of my colleagues pointed this out):\n-Tenant is a local Tenant on SfB server. I.e. on the hosting pack each customer gets a unique Tenant ID. When creating a HostedVoicemailPolicy for a specific Tenant on Lync/SfBs you would specify the specific local Tenant it\u0026rsquo;s for. If you use -Tenant, you won\u0026rsquo;t be able to view the created HostedVoicemailPolicy unless you specify the Tenant i.e. get-cshostedvoicemailpolicy -tenant \u0026lsquo;11111111-1111-1111-1111-111111111111\u0026rsquo; The -Tenant parameter is available on many SfBs commands (used by the Hosting Pack) hence the theory this isn\u0026rsquo;t the correct parameter for Cloud Voicemail.\n-TenantID This is something that was added to SfBs 2019 HostedVoicemailPolicy and I assume was to facilitate the migration to Cloud Voicemail. However in the latest CU it appears to have been removed.\nIn conclusion we need Microsoft to confirm whether this is required.\n","permalink":"https://chrishayward.co.uk/2020/02/06/skype-for-business-server-cloud-voicemail-configuration-tenant-or-tenantid/","summary":"\u003cp\u003eTo configure Cloud Voicemail, you should follow this guide from Microsoft: \u003ca href=\"https://docs.microsoft.com/en-us/skypeforbusiness/hybrid/configure-cloud-voicemail\"\u003ehttps://docs.microsoft.com/en-us/skypeforbusiness/hybrid/configure-cloud-voicemail\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eBefore I started writing this post, I knew that \u003cstrong\u003e-Tenant\u003c/strong\u003e should be \u003cstrong\u003e-TenantID\u003c/strong\u003e in SfBs 2019 (TenantID = Your Office 365 TenantID). I have successfully configured customers with CVM using this method. When trying to get a screenshot from a working environment -TenantID was missing! Doing some further investigation it looks like the latest SfBs 2019 CU removes -TenantID (and even -Tenant) from the Set/New-CsHostedVoicemailPolicy cmdlet.\u003c/p\u003e","title":"Skype for Business Server – Cloud Voicemail Configuration – Tenant or TenantID?"},{"content":"There doesn\u0026rsquo;t appear to be any obvious way to check if you have been migrated from Exchange Online UM to Cloud Voicemail in O365, other than calling your Voicemail box and checking to see if the announcement is different.\nI have been through various settings in O365 Remote PowerShell for different customers and can\u0026rsquo;t find anything concrete (Sorry SfBo customers). SfB Server customers can use the Skype for Business Monitoring Reports to identify if users have been migrated. Calls diverted to Voicemail will show RTCC/7.0.0.0 LyncTeamsGateway/1.1.319.0 rather than RTCC/5.0.0.0 MSExchangeUM/15.20.2686.025. But that\u0026rsquo;s not very fun, so here is a script to do it for you:\ncls $Days = 7 $domain = Get-CsSipDomain | Where-Object {$_.IsDefault -eq $True} $Query1 = @\u0026#34; SELECT * FROM [LcsCDR].[dbo].[SessionDetailsView] WHERE ToClientCategory = \u0026#39;ExUM\u0026#39; AND InviteTime BETWEEN DateAdd(DD,-$days,GETDATE() ) and GETDATE() \u0026#34;@ $Query2 = @\u0026#34; SELECT * FROM [LcsCDR].[dbo].[SessionDetailsView] WHERE ToClientVersion LIKE \u0026#39;%Teams%\u0026#39; AND TargetUri LIKE \u0026#39;%$($domain.name)\u0026#39; AND InviteTime BETWEEN DateAdd(DD,-$days,GETDATE() ) and GETDATE() \u0026#34;@ $Backends = Get-CsService -MonitoringDatabase | select PoolFqdn Write-Host \u0026#34;Attempting to check Exchange UM vs CloudVoicemail useage for primary SIP domain $($domain.name)\u0026#34; -ForegroundColor Cyan Write-Host \u0026#34;\u0026#34; Foreach ($BE in $Backends){ $um = Invoke-Sqlcmd -Query $Query1 -ServerInstance $BE.poolfqdn $cvm = Invoke-Sqlcmd -Query $Query2 -ServerInstance $BE.poolfqdn Write-Host \u0026#34;$($BE.poolfqdn)\u0026#34; -ForegroundColor Magenta Write-Host \u0026#34;Exchange UM = $($um.Count)\u0026#34; Write-Host \u0026#34;Cloud Voicemail* = $($cvm.Count)\u0026#34; Write-Host \u0026#34;\u0026#34; } Write-Host \u0026#34;*Assuming calls to LyncTeamsGateway and TargetURI contains $($domain.name)\u0026#34; -ForegroundColor Yellow You should be able to run this from a Skype for Business Front End and as long as you have the Monitoring DBs deployed and SQL access it should work. By default it checks the last 7 days (variable in script) against all of your Monitoring DBs using your primary sip domain.\nThe SQL Query makes an assumption that if the ToClientVersion is LyncTeamsGateway and the TargetURI matches your SIP domain, then this is most likely a Cloud Voicemail call. If you don\u0026rsquo;t filter on TargetURI it will pull back results from Teams customers you\u0026rsquo;re federated with. Caveat, if you have some users in TeamsOnly mode, this could throw the script off. I couldn\u0026rsquo;t find a more accurate way unfortunately. You would see the UM count as \u0026ldquo;0\u0026rdquo; though as per my examples. Finding UM calls is easy, Microsoft made a ToClientCategory of ExUM, unfortunately we don\u0026rsquo;t have that luxury with CVM! Here are some example outputs from two customers.\nSfBs 2015 customer with a Hybrid - Still using Exchange UM\nSfBs 2019 customer with a Hybrid - Using Cloud Voicemail\nSfBs 2015 customer with a Hybrid - Using Cloud Voicemail\nHope this helps, as always use at your own risk, test in a lab etc etc.\n","permalink":"https://chrishayward.co.uk/2020/02/06/skype-for-business-server-script-check-if-migrated-to-cloud-voicemail/","summary":"\u003cp\u003eThere doesn\u0026rsquo;t appear to be any obvious way to check if you have been migrated from Exchange Online UM to Cloud Voicemail in O365, other than calling your Voicemail box and checking to see if the announcement is different.\u003c/p\u003e\n\u003cp\u003eI have been through various settings in O365 Remote PowerShell for different customers and can\u0026rsquo;t find anything concrete (Sorry SfBo customers). SfB Server customers can use the Skype for Business Monitoring Reports to identify if users have been migrated. Calls diverted to Voicemail will show \u003cstrong\u003eRTCC/7.0.0.0 LyncTeamsGateway/1.1.319.0\u003c/strong\u003e rather than \u003cstrong\u003eRTCC/5.0.0.0 MSExchangeUM/15.20.2686.025\u003c/strong\u003e. But that\u0026rsquo;s not very fun, so here is a script to do it for you:\u003c/p\u003e","title":"Skype for Business Server – Script – Check if migrated to Cloud Voicemail"},{"content":"Scenario: Customer wants to migrate to Teams, but they have a Contact Centre (CC) / Call Recording solution attached to their Skype for Business Server (SfBs) environment. They can\u0026rsquo;t migrate the CC to Teams yet as there isn\u0026rsquo;t a feature parity solution that works with Teams. They are happy with their current CC solution so plan to leave their CC users on SfBs and migrate everyone else to Teams Only mode.\nThe customer wants the CC users to use SfB for CC call handling, outbound PSTN calls \u0026amp; internal transfers. They should use Teams for all other modalities, including Instant Messaging and Meetings.\nHere are the Coexistence Modes available for the SfB / CC users.\nSfB OnlyNot suitable, disables Teams, users must use Teams for IMs and Meetings like the rest of the orgTeams Collaboration ModeNot suitable, this would make the SfB client default for incoming IMs \u0026amp; would not allow Teams meetingsTeams Collaboration and Meetings ModeNot suitable, this would allow Meetings in Teams, but the SfB client would be default for IMs.Teams OnlyNot suitable, user would need to be hosted Online and disabled for SfB, breaking the CC.IslandsSfB and Teams operate as two separate clients. IMs \u0026amp; calls initiated from Teams Only users would be delivered to the Contact Centre users Teams client. CC users can use their Teams client to initiate IMs and use Teams for Conferences. It looks like we have a valid use case for Islands. Next we will look at how we can improve this solution as users could still use their SfB clients to initiate IMs and start SfB conferences. In terms of the CC users, they need the ability to do two things in SfB\nMake / Receive PSTN calls via the CC Transfer a PSTN call to a back office Teams Only user The steps to do this are:\nDisable Conferencing in SfBs. Ensure users are allocated a Conferencing Policy with all features disabled, including multi-party IM chat - Force the users to use Teams Disable SfB Mobile Sign-in. Users should use the Teams app on their Mobiles. Optional - Disable External Access. If CC users are always office based, then it would be worth creating an External Access policy to block SfB sign-in over the Edge server Disable Conferencing PowerShell example:\nNote - Most SfB Contact Centres use the conferencing service. You will need to ensure that you assign a Conferencing Policy that isn\u0026rsquo;t restricted to your CC TrustedApplicaitons/ApplicationEndpoints as per the vendors instructions.\nNew-CsConferencingPolicy -identity \u0026#34;CC-Disable-Conferencing\u0026#34; ` -AllowIPAudio $False ` -AllowIPVideo $False ` -AllowMultiView $False ` -Description \u0026#34;Disables all SfB conferencing features\u0026#34; ` -AllowParticipantControl $False ` -AllowAnnotations $False ` -DisablePowerPointAnnotations $False ` -AllowUserToScheduleMeetingsWithAppSharing $False ` -AllowNonEnterpriseVoiceUsersToDialOut $False ` -AllowAnonymousUsersToDialOut $False ` -AllowAnonymousParticipantsInMeetings $False ` -AllowExternalUsersToSaveContent $False ` -AllowExternalUserControl $False ` -AllowExternalUsersToRecordMeeting $False ` -AllowPolls $False ` -AllowSharedNotes $False ` -EnableDialInConferencing $False ` -EnableAppDesktopSharing \u0026#34;None\u0026#34; ` -AllowConferenceRecording $False ` -EnableP2PRecording $False ` -EnableFileTransfer $False ` -EnableP2PFileTransfer $False ` -EnableP2PVideo $False ` -AllowLargeMeetings $False ` -EnableDataCollaboration $False ` -MaxVideoConferenceResolution VGA ` -MaxMeetingSize 2 ` -EnableMultiViewJoin $False Disable Mobile Sign-In PowerShell example\nNew-CsMobilityPolicy -Identity \u0026#34;CC-DisableMobility\u0026#34; -EnableMobility $False Disable External Access PowerShell example (Optional)\nNew-CsExternalAccessPolicy -Identity \u0026#34;CC-Disable-All\u0026#34; ` -Description \u0026#34;Disable SfB sign in from the internet and disable all federation\u0026#34; ` -EnableOutsideAccess $False ` -EnableFederationAccess $False ` -EnablePublicCloudAccess $False ` -EnablePublicCloudAudioVideoAccess $False ` -EnableXmppAccess $False | out-null At this point, users are forced to use Teams for Conferencing \u0026amp; Mobile sign-in, but they could still use their Windows SfB clients to initiate IMs and P2P Video Calls which are not required in a Contact Centre. It\u0026rsquo;s not possible to do this with a SfB policy, but it is possible via the registry. We can achieve this by pushing out the following registry file to all Windows Machines. It could be locked down to CC users machines, but if they roam onto another machine they won\u0026rsquo;t have the key. As all other users are Teams Only, there shouldn\u0026rsquo;t be an issue pushing this out globally.\nWindows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Microsoft\\Office\\16.0\\Lync] \u0026#34;DisableIM\u0026#34;=dword:00000001 \u0026#34;DisablePC2PCVideo\u0026#34;=dword:00000001 That\u0026rsquo;s it, users will be able to use SfB to handle Contact Centre calls, but will be forced to use Teams for all other features. This isn\u0026rsquo;t a long term solution and when a native Teams version of your Contact Centre is available, you should migrate the users.\nDisclaimer - This post is for information only. Test thoroughly in your environment.\n","permalink":"https://chrishayward.co.uk/2020/01/24/microsoft-teams-a-real-world-use-for-islands-mode-with-a-sfb-contact-centre/","summary":"\u003cp\u003e\u003cstrong\u003eScenario:\u003c/strong\u003e Customer wants to migrate to Teams, but they have a Contact Centre (CC) / Call Recording solution attached to their Skype for Business Server (SfBs) environment. They can\u0026rsquo;t migrate the CC to Teams yet as there isn\u0026rsquo;t a feature parity solution that works with Teams. They are happy with their current CC solution so plan to leave their CC users on SfBs and migrate everyone else to Teams Only mode.\u003c/p\u003e","title":"Microsoft Teams – A real world use for Islands Mode with a SfB Contact Centre?"},{"content":"Over the past few days I have started getting an error when replying to people in Microsoft Teams. \u0026ldquo;Due to an org policy change, you can enjoy a richer chat and calling experience. Continue your conversation here.\u0026rdquo;\nI\u0026rsquo;m not 100%, but I think I know why this is happening. In my organisation everyone is in \u0026ldquo;Islands\u0026rdquo; mode (ignoring my own advice here in Step 2 and 3): /2019/05/17/skype-for-business-server-to-microsoft-teams-in-10-steps/\nI am one of a few users in Teams Only mode, i.e. I can no longer use SfB to initiate IMs and Calls. My SfB client is now only used to join SfB meetings.\nAs I\u0026rsquo;m in Teams Only mode and the rest of my company is in Islands, if I try to initiate an IM conversation with anyone in Islands, Teams by default will send my conversation to their Teams client. They are in Islands after all, both clients are \u0026ldquo;Active\u0026rdquo; for IMs and calls.\nIf someone in SfB initiates an IM conversation with me, as I\u0026rsquo;m in Teams Only mode, their SfB client will send the IM to my Teams client and I can reply back to them in SfB \u0026amp; even call their SfB client (great).\nFor the last 12 months this has worked (although a broken Interop model), anyone who IMs me from SfB and I deal with day to day, I have managed to pin in Teams so I can always IM them in SfB!\nSince Thursday 12th December 2019 this has not been possible. If someone IMs me from SfB, it\u0026rsquo;s hit and miss if I can reply to them. Sometimes I see the \u0026ldquo;Type a new message\u0026rdquo; box and sometimes all I can do is click the \u0026ldquo;Continue your conversation here\u0026rdquo; link (which takes me to a Teams Conversation).\nAs above, I\u0026rsquo;m not 100%, we have checked our O365 Tenant, everyone is still in Islands and no other changes have been made. What I believe is happening is Microsoft are getting stricter with the Interop model and forcing you to use Teams more if you\u0026rsquo;re in Islands. After all, in Islands mode we are saying Teams is a valid conversation path. The solution is to move to a supported Interop mode.\n","permalink":"https://chrishayward.co.uk/2019/12/16/microsoft-teams-error-due-to-an-org-policy-change/","summary":"\u003cp\u003eOver the past few days I have started getting an error when replying to people in Microsoft Teams. \u0026ldquo;Due to an org policy change, you can enjoy a richer chat and calling experience. Continue your conversation here.\u0026rdquo;\u003c/p\u003e\n\u003cfigure\u003e\n    \u003cimg loading=\"lazy\" src=\"/wp-content/uploads/2019/12/Teams-DueToOrgPolicyChange.jpg\"/\u003e \n\u003c/figure\u003e\n\n\u003cp\u003eI\u0026rsquo;m not 100%, but I think I know why this is happening. In my organisation everyone is in \u0026ldquo;Islands\u0026rdquo; mode (ignoring my own advice here in Step 2 and 3): \u003ca href=\"/2019/05/17/skype-for-business-server-to-microsoft-teams-in-10-steps/\"\u003e/2019/05/17/skype-for-business-server-to-microsoft-teams-in-10-steps/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eI am one of a few users in Teams Only mode, i.e. I can no longer use SfB to initiate IMs and Calls. My SfB client is now only used to join SfB meetings.\u003c/p\u003e","title":"Microsoft Teams – Error – Due to an org policy change"},{"content":"If you have used Lync or Skype for Business, you will be familiar with the \u0026ldquo;Tag for Status Change Alerts\u0026rdquo; feature, AKA Tagging. If you\u0026rsquo;re not familiar, have you ever signed into SfB and someone IMs you straight away? You were most likely tagged!\nThis feature has been missing from Microsoft Teams and has over 600 votes on User Voice: https://microsoftteams.uservoice.com/forums/555103-public/suggestions/18925360-tag-for-status-updates\nThe last updated, posted by Alex on 07/02/2019 stated \u0026quot; I’m excited to announce that this feature is in internal testing, and should be coming soon! Thanks! \u0026ldquo;\nToday I noticed this feature is available in my companies Teams Tenant and is now called \u0026ldquo;Notify when available\u0026rdquo;.\nThis appears to work for internal Teams users and Skype users (If you\u0026rsquo;re in Teams Only mode). This feature does not appear to be available on Federated Contacts.\n","permalink":"https://chrishayward.co.uk/2019/06/06/microsoft-teams-notify-when-available-tagging/","summary":"\u003cp\u003eIf you have used Lync or Skype for Business, you will be familiar with the \u0026ldquo;Tag for Status Change Alerts\u0026rdquo; feature, AKA Tagging. If you\u0026rsquo;re not familiar, have you ever signed into SfB and someone IMs you straight away? You were most likely tagged!\u003c/p\u003e\n\u003cp\u003eThis feature has been missing from Microsoft Teams and has over 600 votes on User Voice: \u003ca href=\"https://microsoftteams.uservoice.com/forums/555103-public/suggestions/18925360-tag-for-status-updates\"\u003ehttps://microsoftteams.uservoice.com/forums/555103-public/suggestions/18925360-tag-for-status-updates\u003c/a\u003e\u003cbr\u003e\nThe last updated, posted by Alex on 07/02/2019 stated \u003cem\u003e\u0026quot; I’m excited to announce that this feature is in internal testing, and should be coming soon! Thanks! \u0026ldquo;\u003c/em\u003e\u003c/p\u003e","title":"Microsoft Teams – Notify When Available (Tagging)"},{"content":"When connecting to Microsoft Teams or Skype Online ( https://docs.microsoft.com/en-us/office365/enterprise/powershell/manage-skype-for-business-online-with-office-365-powershell) you may experience the following error:\nUnable to discover PowerShell endpoint URI At C:\\Program Files\\Common Files\\Skype for Business Online\\Modules\\SkypeOnlineConnector\\SkypeOnlineConnectorStartup.psm1:114 char:9 + throw $resources.DiscoveringEndpointFail + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : OperationStopped: (Unable to disco...ll endpoint URI:String) [], RuntimeException + FullyQualifiedErrorId : Unable to discover PowerShell endpoint URI This occurs when your Office 365 Admin Account is not an onmicrosoft.com account. To resolve you need to specify the -OverrideAdminDomain switch on New-CsOnlineSession and specify your default O365 onmicrosoft domain. E.g:\nImport-Module SkypeOnlineConnector $session = New-CsOnlineSession -UserName \u0026#34;me@mydomain.com\u0026#34; -OverrideAdminDomain \u0026#34;\u0026lt;MyTenant\u0026gt;.onmicrosoft.com\u0026#34; Import-PSSession -Session $session ","permalink":"https://chrishayward.co.uk/2019/05/30/teams-skype-online-unable-to-discover-powershell-endpoint-uri/","summary":"\u003cp\u003eWhen connecting to Microsoft Teams or Skype Online ( \u003ca href=\"https://docs.microsoft.com/en-us/office365/enterprise/powershell/manage-skype-for-business-online-with-office-365-powershell\"\u003ehttps://docs.microsoft.com/en-us/office365/enterprise/powershell/manage-skype-for-business-online-with-office-365-powershell\u003c/a\u003e) you may experience the following error:\u003c/p\u003e\n\u003cfigure\u003e\n    \u003cimg loading=\"lazy\" src=\"/wp-content/uploads/2019/05/PS-EndpointURI.jpg\"/\u003e \n\u003c/figure\u003e\n\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eUnable to discover PowerShell endpoint URI\nAt C:\\Program Files\\Common Files\\Skype for Business Online\\Modules\\SkypeOnlineConnector\\SkypeOnlineConnectorStartup.psm1:114 char:9\n+         throw $resources.DiscoveringEndpointFail\n+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n    + CategoryInfo          : OperationStopped: (Unable to disco...ll endpoint URI:String) [], RuntimeException\n    + FullyQualifiedErrorId : Unable to discover PowerShell endpoint URI\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThis occurs when your Office 365 Admin Account is not an onmicrosoft.com account. To resolve you need to specify the -OverrideAdminDomain switch on New-CsOnlineSession and specify your default O365 onmicrosoft domain. E.g:\u003c/p\u003e","title":"Teams/Skype Online – Unable to discover PowerShell endpoint URI"},{"content":"Over the past month, I have had a few different SfB Server (On-Premises) customers report issues Federating with Skype Online (O365) customers. This includes customers who have SfB Hybrids and users homed online.\nThe On-Premises customers have O365 tenants for other services and I always tell non-hybrid Skype On-Prem customers to ensure they don\u0026rsquo;t assign any Skype Online licenses to users. If they assign an E3 or E5 they should un-check the \u0026ldquo;Skype Online\u0026rdquo; license box and for many years, this has worked fine.\nIssues customers were seeing:\nOn-Prem user view Presence of Federated O365 user = OK\nOn-Prem user send IM to Federated O365 user = OK\nAt this point the O365 user can successfully see presence of the On-Prem user and reply to the IMs. Everything appears to work as expected. However, if the O365 user tries to initiate the communications:\nO365 user view Presence of Federated On-Prem user = FAIL\nO365 user send IM to Federated On-Prem user = FAIL\nWe verified customers federation was configured correctly On-Prem. (Get-CsExternalAccessPolicy, Get-CSHostingProvider, Get-CsAllowedDomain, Get-CsAccessEdgeConfiguration, Test-CsFederatedPartner + checked _sipfederationtls._tcp DNS resolution and certificates).\nMicrosoft Support did a trace on their O365 Front End pool and they could see the following error their side.\n4033;reason=\u0026ldquo;To User not authorized for Federation\u0026rdquo;;processing-cluster=\u0026ldquo;sippoolAM30E30.infra.lync.com\u0026rdquo;;processing-frontend=\u0026ldquo;AM30E30FES12.infra.lync.com\u0026rdquo;;target-user-primary-pool=\u0026ldquo;sippoolAM30E30.infra.lync.com\u0026rdquo;;source=\u0026ldquo;AM30E30FES12.infra.lync.com\u0026rdquo;\nFix\nWhen O365 user initiates communications to Federated On-Prem user, O365 thinks the user exists in Skype Online, even though the Skype Online license is disabled for all users in the tenant. Therefore O365 never attempts to send anything to the On-Prem Edge Server and completely ignores the _sipfederationtls._tcp record.\nMy assumption is this is related to Teams and potentially some back end work MS have done to O365. Teams under the hood is sharing a SIP Domain with Skype Online after all. The On-Premises customer has two options:\nMicrosoft support advise to run \u0026ldquo;Disable-CsOnlineSipDomain\u0026rdquo; on the SfB On-Prem customers O365 Tenant:\nhttps://docs.microsoft.com/en-us/powershell/module/skype/disable-csonlinesipdomain?view=skype-ps\nImplement a SfB Hybrid with O365, this will ensure Skype Online knows that it\u0026rsquo;s sharing a Sip Domain with an On-Premises system.\nUltimately, with Microsoft moving from Exchange Online UM to Cloud Voicemail and heavily pushing Teams, if customers have SfB On-Premises and an Office 365 Tenant, we\u0026rsquo;re at the stage where everyone needs a Hybrid. Even if they don\u0026rsquo;t intend to use Skype Online or Teams.\n","permalink":"https://chrishayward.co.uk/2019/05/21/skype-for-business-on-prem-one-way-federation-with-skype-online-customers/","summary":"\u003cp\u003eOver the past month, I have had a few different SfB Server (On-Premises) customers report issues Federating with Skype Online (O365) customers. This includes customers who have SfB Hybrids and users homed online.\u003c/p\u003e\n\u003cp\u003eThe On-Premises customers have O365 tenants for other services and I always tell non-hybrid Skype On-Prem customers to ensure they don\u0026rsquo;t assign any Skype Online licenses to users. If they assign an E3 or E5 they should un-check the \u0026ldquo;Skype Online\u0026rdquo; license box and for many years, this has worked fine.\u003c/p\u003e","title":"Skype for Business On-Prem – One way Federation with Skype Online customers"},{"content":"A Teams upgrade can\u0026rsquo;t be approached like a Lync 2013 \u0026gt;Skype for Business 2015 upgrade. These upgrades are Technology driven, 99% of the work is done by IT. Your end users probably received an email saying \u0026ldquo;From tomorrow morning your Lync client will now look like Skype \u0026rdquo; and that\u0026rsquo;s about as much involvement as they had.\nYour Teams upgrade needs to be business driven, it\u0026rsquo;s a new way of way of working.\nCan your users create a SharePoint site or new File Share today?\nCan they install non-standard applications?\nCan they create a new group in AD?\nCan they create persistent chat rooms?\nIn most companies the answer to the above is no. If your users can\u0026rsquo;t do the above, what are they doing? (Hint, they are using apps like WhatsApp, Slack or Dropbox aka Shadow IT).\nThere\u0026rsquo;s a whole Business Assessment piece I\u0026rsquo;m not going to cover in detail, but you should check out: https://aka.ms/successwithteams\nI\u0026rsquo;m going to cover the minimal Technical steps you should take to adopt Teams when you use Skype for Business Server today. This method will allow you to adopt Teams at your own pace, you could do this in a few months or you could stretch it over years.\nDisclaimer: There are many ways to approach this and these guidelines are my personal recommendations.\nStep 1 - Ensure you have SfB Server Hybrid with Skype Online.\nThis is a prerequisite to move users from SfB Server to Teams. It will also ensure that Federation works correctly and Microsoft don\u0026rsquo;t automatically upgrade your O365 Tenant to \u0026ldquo;Teams Only\u0026rdquo;.\nStep 2 - Get out of Islands mode!\nYou\u0026rsquo;ve probably downloaded teams and had a play, but if you want to mass adopt Teams in the organisation, Islands is not a long term Coexistence or Interop mode, it just doesn\u0026rsquo;t play nice when you start moving users from SfB to Teams Only mode. A lot of customers don\u0026rsquo;t even know they are in Islands! Further reading:\nhttps://regarding365.com/beware-of-the-island-understanding-teams-and-skype-coexistence-modes-300bcf412fa2\nhttps://erwinbierens.com/post/2019-04-18-get-the-hell-out-of-islandsmode/\nhttps://blog.valeconsulting.co.uk/2018/10/26/microsoft-teams-coexistence-interop-with-skype-for-business/\nStep 3 - Choose your coexistence mode.\nAs above you should get out of Islands, so which mode should you choose? There may be a temptation to have 50% of users Skype Only and move 50% of users to Teams only. Easy, right? Well this is where you will encounter Teams and SfB Interoperability. In the real world this is how both clients behave during Interop:\n/2019/04/28/teams-and-skype-for-business-interoperability-feature-matrix/\nDepending on your user base, this could be very confusing for end users. You probably want to deploy Teams to tackle your Shadow IT problems so my recommendation would be to start with Teams in Collaboration Mode. Also,if you use SfB as your Telephone System, you can\u0026rsquo;t just move users to Teams Only without figuring out what to do with their telephone number, so Collab mode is a great place to cut one\u0026rsquo;s teeth.\nIn Teams Collaboration Mode, SfB is still the UC client for Instant Messaging, Voice, Video and Meetings, but you get to use all of the other Teams goodness alongside it. Users will have both clients, but Teams isn\u0026rsquo;t used for UC (yet!)\nStep 4 - Figure out how you are going to use the Teams features of Teams!\nWho can create a Team?\nHow do users request a Team?\nDo you need to implement a naming convention?\nShould you automate creating Teams from another system using Graph API and Flow?\nWhat policies need to be created? (Block certain apps / allow gifys)\nDo you want to use Teams Templates?\nWhat Line of Business Apps can you integrate?\nWhat PowerApps or automation will help your business?\nWhat business processes or policies need updating?\nThe Business Assessment stage is an important milestone in your Teams adoption. The worst thing you can do is dump this application on users desktops because it will create a birds nest to unpick at a later date.\nStep 5 - Get your network optimised!\nIf you have Skype for Business On-Premises, then the majority of your SfB traffic is on your WAN. Only external users, federated parties and remote workers are consuming the service over the internet.\nTeams is a public cloud solution. That means your Internet egress points need to be optimised to carry Real Time Media from inside your network to Teams in O365.\nThere is a lot to consider and when I talk to customers about their network they tend to say \u0026ldquo;Our network is fine, we can use Teams no problem\u0026rdquo;. Then when I go through what a Network assessment entails and everything that needs to be checked, all of a sudden the penny drops that if they enable 1000s of users for Teams through their single internet Egress point it probably isn\u0026rsquo;t going to cope well. Best place to start is here:\nhttps://docs.microsoft.com/en-us/microsoftteams/prepare-network\nStep 6 - Roll out to end users\nWith the network now optimised for Teams and all of your policies and processes in place, it\u0026rsquo;s now a good time to start rolling out Teams to users. This is where Change \u0026amp; Adoption is important and you should follow the guidelines in the Adoption Hub: https://aka.ms/successwithteams\nStep 7 - Switch from Skype meetings to Teams meetings\nWith end users now familiar with the Teams application, it\u0026rsquo;s now a great time to switch meetings from Skype to Teams. You can enable \u0026ldquo;Teams Collaboration \u0026amp; Meetings\u0026rdquo; mode on a user by user basis.\nGenerally I would start with the Teams \u0026ldquo;Power Users\u0026rdquo; or \u0026ldquo;Champions\u0026rdquo; in your organisation These users will no longer be able to schedule Skype Meetings and all new meetings will be in Teams (Unless they do this as a workaround)\nThe advantage of this phased approach is users will start to get familiar with Teams meetings, even if they are just a participant at first.\nThis is also a good opportunity to verify your network is performing optimally as the Conference Bridge is Office 365, so every Teams meeting participant is sending/receiving media to O365 over the internet. You can use Call Analytics and Call Quality Dashboard in O365 to check the network performance and user experience.\nDon\u0026rsquo;t forget to move Meeting Rooms, some Meeting Room devices allow sign-in to Skype and Teams simultaneously which is useful during this transition stage.\nStep 8 - Configure Direct Routing or Phone System\nIf you use SfB as your Phone System, you most likely have an SBC on-premises. Before you can move a user to Teams Only mode, you need to be able to route their Telephone Number to O365. The best approach is to speak to your SBC vendor or IT Service Provider on how to connect to Direct Routing.\nMicrosoft guidance here:\nhttps://docs.microsoft.com/en-us/MicrosoftTeams/direct-routing-landing-page\nYou could purchase Call Bundles from Microsoft, however you will most likely have to port your numbers in ranges to Microsoft or issue new DDIs to your users. The day of the port is the day you need to migrate users to Teams Only and you may have numbers in your ranges used complex voice (Call Centre / Analogue etc).\nDirect Routing allows more control, as you can move individual DDIs to Teams, you can easily roll back and you can keep your existing Telco provider. There are also Telcos that will offer Direct Routing as a service, so it\u0026rsquo;s worth speaking to your provider to see how they can help.\nStep 9 - Move users and devices to Teams Only\nAssuming users don\u0026rsquo;t have complex voice requirements (i.e. Contact Centre or Call Recording), you can now move users from SfB and Teams Collaboration Mode to \u0026ldquo;Teams Only\u0026rdquo; mode. This almost makes the SfB client redundant, it is only used to join Skype for Business meetings (which federated partners could still send) and will still stay open in the background.\nIt\u0026rsquo;s a good idea to complete this migration as quickly as possible as your users will be subject to the interop limitations I detailed here:\n/2019/04/28/teams-and-skype-for-business-interoperability-feature-matrix/\nMeeting Rooms and other devices should also be migrated to Teams.\nIf some users do have complex voice requirements that Teams can\u0026rsquo;t deliver yet, you will need to leave them in SfB Only Mode or one of the Teams Collab Modes. These users will need to understand the the Interop limitations and how they can get around any issues by escalating to a Skype or Teams meeting.\nStep 10 - Decommission Skype for Business Server\nOnce everyone is moved to Teams Only mode and you have solutions for any complex voice requirements, you can now decommission SfB Server.\nGuidelines here:\nhttps://blogs.technet.microsoft.com/fasttracktips/2017/06/27/decommissioning-skypelync-on-premises/\n","permalink":"https://chrishayward.co.uk/2019/05/17/skype-for-business-server-to-microsoft-teams-in-10-steps/","summary":"\u003cp\u003eA Teams upgrade can\u0026rsquo;t be approached like a Lync 2013 \u0026gt;Skype for Business 2015 upgrade. These upgrades are Technology driven, 99% of the work is done by IT. Your end users probably received an email saying \u0026ldquo;From tomorrow morning your Lync client will now look like Skype \u003cInsert screenshots of differences\u003e\u0026rdquo; and that\u0026rsquo;s about as much involvement as they had.\u003c/p\u003e\n\u003cp\u003eYour Teams upgrade needs to be business driven, it\u0026rsquo;s a new way of way of working.\u003c/p\u003e","title":"Skype for Business Server to Microsoft Teams in 10 steps"},{"content":"I get asked this quite frequently. What features are available between Teams and Skype for Business?\nFirst I must clarify that interop does not work in Islands mode. If you\u0026rsquo;re in SfB and Teams Islands, then you will experience quirky issues. You must be in one of the following modes:\nTeams Users = Teams Only Mode SfB Users = SfB Only, Collab Mode or Collab \u0026amp; Meetings Basically, if you\u0026rsquo;re in Islands today, before you move anyone to Teams Only, you need to move all users to one of the SfB Only modes, or face a broken interop model\nIf you have SfB on-prem, then a SfB Hybrid is a prerequisite for interop to work. Mark Vale covers interop in detail here:\nhttps://blog.valeconsulting.co.uk/2018/10/26/microsoft-teams-coexistence-interop-with-skype-for-business/\nOnce you\u0026rsquo;re in a supported interop mode, this is how Teams and SfB will behave:\nUpdate: 06/06/2019 - Tagging now available in Teams: /2019/06/06/microsoft-teams-notify-when-available-tagging/\nIt\u0026rsquo;s not exactly a smooth transition from SfB to Teams, therefore once you have entered this mode, Microsoft class it as a Direct Upgrade and you should retire SfB as quickly as possible.\n\u0026ldquo;In a direct upgrade journey, you first deploy Teams alongside Skype for Business in Islands mode as part of evaluation and early adoption, and then upgrade your users to Teams Only mode with the goal of quickly retiring Skype for Business from the environment for all users in the organization\u0026rdquo;\nhttps://docs.microsoft.com/en-us/microsoftteams/upgrade-and-coexistence-of-skypeforbusiness-and-teams\nThere you have it, once you have turned on the taps for Teams Only mode, you should move as quickly as possible from SfB.\nQuick refresher on the different Teams modes:\nIslands = POC / Pilot, SfB and Teams will operate as two separate UC clients.\nSfB Only = I don\u0026rsquo;t want to use Teams at all\nTeams Collaboration Mode = I want to use SfB as my UC client and Teams as my Collaboration Tool (No chat, calling, or meetings in Teams)\nTeams Collaboration and Meetings Mode = Same as collaboration mode, except all new Online Meetings will now be in Teams rather than SfB.\nTeams Only = I want Teams to be my primary UC client\n","permalink":"https://chrishayward.co.uk/2019/04/28/teams-and-skype-for-business-interoperability-feature-matrix/","summary":"\u003cp\u003eI get asked this quite frequently. What features are available between Teams and Skype for Business?\u003c/p\u003e\n\u003cp\u003eFirst I must clarify that interop does not work in Islands mode. If you\u0026rsquo;re in SfB and Teams Islands, then you will experience quirky issues. You must be in one of the following modes:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eTeams Users = Teams Only Mode\u003c/li\u003e\n\u003cli\u003eSfB Users = SfB Only, Collab Mode or Collab \u0026amp; Meetings\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eBasically, if you\u0026rsquo;re in Islands today, before you move anyone to Teams Only, you need to move all users to one of the SfB Only modes, or face a broken interop model\u003c/p\u003e","title":"Teams and Skype for Business Interoperability feature Matrix"},{"content":"Can you schedule a Skype for Business meeting if you\u0026rsquo;re in Teams Only mode?\nWhen a user moves to Teams Only, the \u0026ldquo;New Skype Meeting\u0026rdquo; button is removed from the Outlook Ribbon. Therefore the user can no longer schedule Skype for Business Meetings.\nI\u0026rsquo;ve been testing Teams Only for the past couple of months and out of interest I wondered whether I could still schedule a Skype for Business Meeting. Note, I can\u0026rsquo;t find any official guidance from Microsoft, so although this works today, I would imagine Microsoft could disable this at any point. When you\u0026rsquo;re in Teams Only mode, your meetings should be scheduled in Teams.\nThis is possible via the Skype for Business Web Scheduler at:\nhttps://sched.lync.com You should login using your O365 credentials if required. After that, it\u0026rsquo;s pretty straight forward. Complete the New Meeting request:\nSkype for Business Web Scheduler\nOnce the meeting has been generated, the Meeting Join Info can be copied and sent to participants:\nSkype for Business Meeting Join Info\nIt\u0026rsquo;s then possible to join the SfB Meeting. Note if you have SfB installed, it will use your Skype Desktop client, otherwise you will use the SfB Web App. External Participants can also join:\nTeams user hosting a Skype for Business meeting\nThat\u0026rsquo;s all there is to it. All users in the O365 Tenant I used to test this are Teams Only so it should work for anyone. I did this more out of interest and I\u0026rsquo;m sure it\u0026rsquo;s a rare use case, but it\u0026rsquo;s interesting to know it works (for now).\n","permalink":"https://chrishayward.co.uk/2019/03/27/microsoft-teams-schedule-a-skype-for-business-meeting/","summary":"\u003cp\u003eCan you schedule a Skype for Business meeting if you\u0026rsquo;re in Teams Only mode?\u003c/p\u003e\n\u003cp\u003eWhen a user moves to Teams Only, the \u0026ldquo;New Skype Meeting\u0026rdquo; button is removed from the Outlook Ribbon. Therefore the user can no longer schedule Skype for Business Meetings.\u003c/p\u003e\n\u003cfigure\u003e\n    \u003cimg loading=\"lazy\" src=\"/wp-content/uploads/2019/03/Outlook-Teams-Meeting.jpg\"/\u003e \n\u003c/figure\u003e\n\n\u003cp\u003eI\u0026rsquo;ve been testing Teams Only for the past couple of months and out of interest I wondered whether I could still schedule a Skype for Business Meeting. \u003cstrong\u003eNote, I can\u0026rsquo;t find any official guidance from Microsoft, so although this works today, I would imagine Microsoft could disable this at any point. When you\u0026rsquo;re in Teams Only mode, your meetings should be scheduled in Teams.\u003c/strong\u003e\u003c/p\u003e","title":"Microsoft Teams – Schedule a Skype for Business Meeting"},{"content":" Microsoft Teams with Calls Icon\nWhen enabling users for Microsoft Teams Direct Routing, I have noticed when configuring a user for Enterprise Voice, that it can take up to a day for the \u0026ldquo;Calls\u0026rdquo; icon to appear so users can make outbound calls using the Dial Pad. Users can successfully receive Inbound calls over DR immediately. You verify that your user is correctly configured for Teams DR:\nGet-CsOnlineUser -Identity john.smith@mydomain.com | select sipad*, *Voice*, *LineURI* Verify Teams DR user config\nCalls Icon does not appear\nI have seen this issue on my Lab Tenant (which is a full O365 E5 Sub) and Live Customer Tenants. Whilst this is slightly annoying, you just need to be aware to Voice Enable all users the day before you migrate the users DDI or port Numbers to Teams DR.\nIt gets worse\u0026hellip;\u0026hellip;\u0026hellip;. When changing a users OnlineVoiceRoutingPolicy, the calls Icon disappears from the users Teams client if they restart it! I have tested this a few times and it can take 30 minutes to 5 hours for the Calls icon to return. This occurs on multiple machines \u0026amp; Teams clients + the Web client.\nAt this stage, I\u0026rsquo;m not sure if it\u0026rsquo;s because I only created the new OnlineVoiceRoutingPolicies in the last 24 hours \u0026amp; O365 needs time to sync in the background, or whether this is a genuine issue when changing users OnlineVoiceRoutingPolicies.\nI will test again next week, but for now it\u0026rsquo;s something to be aware of, especially if you are Live with Teams DR.\n","permalink":"https://chrishayward.co.uk/2019/02/21/microsoft-teams-where-is-my-calls-icon/","summary":"\u003cfigure\u003e\n    \u003cimg loading=\"lazy\" src=\"/wp-content/uploads/2019/02/Teams-Calls-Icon.jpg\"\n         alt=\"Microsoft Teams with Calls Icon\"/\u003e \u003cfigcaption\u003e\n            \u003cp\u003eMicrosoft Teams with Calls Icon\u003c/p\u003e\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n\n\u003cp\u003eWhen enabling users for Microsoft Teams Direct Routing, I have noticed when configuring a user for Enterprise Voice, that it can take up to a day for the \u0026ldquo;Calls\u0026rdquo; icon to appear so users can make outbound calls using the Dial Pad. Users can successfully receive Inbound calls over DR immediately. You verify that your user is correctly configured for Teams DR:\u003c/p\u003e","title":"Microsoft Teams – Where is my \"Calls\" icon?"},{"content":"Are you using Citrix or any other 3rd party application that handles media (e.g. Call Recording / Contact Centre) with Skype for Business? You may find you\u0026rsquo;re not marking this traffic with the correct DSCP markings.\nYou should configure QoS in the usual method using a Windows GPO. Mark Vale documents this process really well: https://blog.valeconsulting.co.uk/2015/09/07/skype-for-business-configuring-quality-of-service-qos/\nPat Richard has a really useful QoS Calculator here: https://www.ucunleashed.com/2821\n\u0026ldquo;Why does it matter if I\u0026rsquo;m using Citrix or a call recording application like Verba?\u0026rdquo; Answer - They have their own executables and don\u0026rsquo;t use the standard SfB exe\u0026rsquo;s to send/receive media!\nI\u0026rsquo;ll start with Citrix. When using SfB in a VDI environment, the user will be using a Thin Client and their SfB client would usually be installed on a XenApp / XenDesktop server in a datacentre somewhere. All SfB calls, whether P2P, PSTN, Conference will traverse the Citrix ICA session which may not be the most optimum path or protocol for Real Time Media. It\u0026rsquo;s also not possible to put QoS on SfB Voice as it would be encapsulated within the ICA session.\nThe solution from Citrix is the HDX Optimization Pack. At a high level, when you make a SfB call, the HDX Pack changes the Media Candidate from the VDI servers IP, to the users Thin Client IP. SfB calls are now outside the ICA session and direct to the Thin Client (yey!). The problem is the HDX Pack doesn\u0026rsquo;t have or use Lync.exe on the Thin Client for media traffic, it actually uses MediaEngineService.exe.\nCitrix document it on a blog here: https://www.citrix.com/blogs/2017/12/19/rtop-dont-forget-about-qosdscp/\nYou can check the DSCP markings on your SfB traffic using WireShark, if QoS is working you will see the Expedited Forwarding for Audio Traffic. If you use the Citrix HDX pack and haven\u0026rsquo;t configured QoS, this will not be tagged correctly.\nFor Windows Terminals, the solution is simple, you need to add MediaEngineService.exe to your SfB Client QoS GPO using the same Source Ports and DSCP values as Lync.exe. For non-windows Terminals you need to follow the guidelines in the Citrix Blog above.\nIf you\u0026rsquo;re using a Third Party Contact Centre or Call Recording software you will also have the same issue. Your Third Party app may also not have been configured to use the same Source Ports as your SfB Servers too! I will use Verba as an example.\nVerba has multiple methods to record different SfB modalities, in this example I will cover Audio recording via a Verba Proxy. When a Verba Proxy is utilised to record Audio, Verba modifies the SfB Media Candidates so the SfB client sends its Audio Stream to the Proxy. The proxy sits in the middle of a P2P, PSTN, Conference Call etc depending on the calls types that need to be recorded.\nProblem 1 - Just like Citrix, Verba uses a different executable name so Audio traffic is not tagged as EF 46.\nProblem 2 - Verba by default is not using the same SfB Audio and Video ports you have set for SfB QoS (i.e. Splitting Audio and Video)\nProblem 1 is easily resolved by creating the relevant GPO for \u0026ldquo;recorderproxy.exe\u0026rdquo; (note use Local GPO for RecorderProxy.exe on Edges!):\nProblem 2 is resolved within Verba itself, within the RTP Proxy settings you can specify the port ranges SfB is using for Audio and Video.\nI hope you find this post useful, just keep in mind, if a SfB Audio/Video Stream is going to a non Microsoft application you may not have it covered by QoS. Please feel free to comment your QoS findings!\n","permalink":"https://chrishayward.co.uk/2018/07/25/skype-for-business-qos-with-3rd-party-applications/","summary":"\u003cp\u003eAre you using Citrix or any other 3rd party application that handles media (e.g. Call Recording / Contact Centre) with Skype for Business?  You may find you\u0026rsquo;re not marking this traffic with the correct DSCP markings.\u003c/p\u003e\n\u003cp\u003eYou should configure QoS in the usual method using a Windows GPO.  Mark Vale documents this process really well: \u003ca href=\"https://blog.valeconsulting.co.uk/2015/09/07/skype-for-business-configuring-quality-of-service-qos/\"\u003ehttps://blog.valeconsulting.co.uk/2015/09/07/skype-for-business-configuring-quality-of-service-qos/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003ePat Richard has a really useful QoS Calculator here: \u003ca href=\"https://www.ucunleashed.com/2821\"\u003ehttps://www.ucunleashed.com/2821\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e\u0026ldquo;Why does it matter if I\u0026rsquo;m using Citrix or a call recording application like Verba?\u0026rdquo;\u003c/strong\u003e Answer - They have their own executables and don\u0026rsquo;t use the standard SfB exe\u0026rsquo;s to send/receive media!\u003c/p\u003e","title":"Skype for Business – QoS with 3rd Party Applications"},{"content":"Note this script is provided as an example only - By default a user can set their own Client Pin via the Dial-In Conferencing page (usually dialin.domain.com).\nYou may have a requirement to bulk set a Client Pin if you\u0026rsquo;re rolling out a large number of VOIP phones. The script example below sets a 6 digit client PIN consisting of a two digit prefix followed by the last 4 digits of the users LineUri:\n# Set a pin prefix $PinPrefix = \u0026#34;33\u0026#34; # This will set all users pins to the Pin Prefix and last 4 digits of their LineURI $users = Get-CsUser -Filter {EnterpriseVoiceEnabled -eq $True} ForEach ($user in $users){ $ext = \u0026#34;\u0026#34; Write-Host $USER.SipAddress Write-Host $USER.LineUri $ext = $($user.LineUri).substring($($user.LineUri).length -4,4) Write-Host $pinprefix$ext $user | Set-CsClientPin -Pin $pinprefix$ext } You can amend the \u0026ldquo;$users = Get-CsUser \u0026quot; line to filter for users to suit your need (i.e an OU) or if you need to bulk set pins on Common Area Phones.\n","permalink":"https://chrishayward.co.uk/2018/07/25/skype-for-business-bulk-set-client-pin/","summary":"\u003cp\u003eNote this script is provided as an example only - By default a user can set their own Client Pin via the Dial-In Conferencing page (usually dialin.domain.com).\u003c/p\u003e\n\u003cp\u003eYou may have a requirement to bulk set a Client Pin if you\u0026rsquo;re rolling out a large number of VOIP phones.   The script example below sets a 6 digit client PIN consisting of a two digit prefix followed by the last 4 digits of the users LineUri:\u003c/p\u003e","title":"Skype for Business – Bulk Set Client Pin"},{"content":"This is a static website. It doesn\u0026rsquo;t set cookies, run analytics or tracking, or collect any personal data.\nComments are closed. The comments shown on older posts were left by readers when the blog ran on WordPress and are kept as part of the archive; email addresses and IP addresses were never published and have not been carried over.\nThe site is hosted on Microsoft Azure Static Web Apps, which, like any web host, may keep standard server logs (such as IP address and pages requested) for security and operations.\n","permalink":"https://chrishayward.co.uk/privacy-policy/","summary":"\u003cp\u003eThis is a static website. It doesn\u0026rsquo;t set cookies, run analytics or tracking, or collect any personal data.\u003c/p\u003e\n\u003cp\u003eComments are closed. The comments shown on older posts were left by readers when the blog ran on WordPress and are kept as part of the archive; email addresses and IP addresses were never published and have not been carried over.\u003c/p\u003e\n\u003cp\u003eThe site is hosted on Microsoft Azure Static Web Apps, which, like any web host, may keep standard server logs (such as IP address and pages requested) for security and operations.\u003c/p\u003e","title":"Privacy Policy"},{"content":"The biggest news from Microsoft Ignite is the announcement of Microsoft Teams replacing Skype for Business Online.\nThis has sent the Community, Skype for Business service providers and Integrators around the globe into a bit of a rumour mill.\nSo the key point is Teams will replace Skype for Business Online. Microsoft will be announcing a new version of Skype for Business Server 2019 (Formerly LCS, OCS \u0026amp; Lync) that we all know and love next year, however this will be for On-Prem customers (I.E. not in a Microsoft datacentre). You will be able to have a Skype for Business and Teams Hybrid deployment.\nIn this post I am sharing some of the tweets that were following Ignite with some of my own thoughts and comments.\nPersistent Chat officially not shipping with #skype4b 2019 server. Very very few customers using it, but it’s used in some places\n\u0026mdash; Tom Arbuthnot (@tomarbuthnot) September 26, 2017 Persistent Chat is probably the most obvious feature that will be removed from the Skype for Business product. I\u0026rsquo;ve done a lot of Lync/Skype for Business deployments and most customers opt out of installing pChat, where I have installed it the customer hasn\u0026rsquo;t used it. Microsoft will also want to push customers towards the Teams client.\nhttps://twitter.com/kenlasko/status/912704017503014912\nThe next SfB feature to take a hit is Survivable Branch Appliances. From Ignite it would appear the new version of Skype for Business server will support SBA\u0026rsquo;s, but there won\u0026rsquo;t be a new version. Effectively SBAs will still be running on Lync 2013, SfB 2015 codebase.\nSay goodbye to silverlight #skype4b\n\u0026mdash; Pat Richard - MVP 🕵🏼 (@patrichard) September 26, 2017 This won\u0026rsquo;t be missed, it\u0026rsquo;s incredible Lync 2013 and SfB 2015 shipped with Silverlight Control Panels when Microsoft announced the end of Silverlight in 2012! Viva PowerShell anyway.\nSay goodbye to MSI client in #skype4B 2019. C2R only.\n\u0026mdash; Pat Richard - MVP 🕵🏼 (@patrichard) September 26, 2017 Now this is a bold move, the new Skype for Business server version will require Microsoft Office Click to Run (The version you download from Office 365). Most customers I deal with are still on Office 2013, some Office 2010!\nNo Director role in #skype4b https://t.co/lDsKmRUiX4\n\u0026mdash; Pat Richard - MVP 🕵🏼 (@patrichard) September 26, 2017 The Director role is another part of SfB getting the chop. Deployed infrequently, although some Security Consultants will insist on a Director Pool to mitigate HTTPS traffic from the Internet hitting the Front End Pool.\nWhoa, Skype vNext will have no standard edition version\n\u0026mdash; C. Anthony Caragol (@CAnthonyCaragol) September 26, 2017 No more Standard Edition. This is very interesting, is this to force smaller businesses that can\u0026rsquo;t afford the infrastrucutre for Enterprise Edition onto O365 Teams? It\u0026rsquo;s unclear yet whether single or dual server Front End pools will be supported. Since Lync 2013 its been 3 Front Ends minimum per pool which can be quite expensive for a small firm.\nUPDATE 27/09/2017, It\u0026rsquo;s being reported that single server FE pools will be supported but not 2 server pools with 3 servers minimum required for HA. The key difference between SfB 2015 Standard Edition and SfB 2019 will be a dependency on a dedicated SQL backend. This isn\u0026rsquo;t a huge deal as most Standard Edition customers deploy a SQL backend for Monitoring and Archiving databases.\nOnly side by side migrations to #Skype4b vnext no more in place\n\u0026mdash; C. Anthony Caragol (@CAnthonyCaragol) September 26, 2017 No in-place upgrade to SfB 2019. This is no different to how OCS \u0026gt; Lync 2010 \u0026gt; Lync 2013 migrations occured. Certainly makes migrations more complicated and need spare infrastructure in place temporarily during migration.\nhttps://twitter.com/kenlasko/status/912697765121155072\nIt looks like you may need a Skype for Business server and Teams Hybrid to utilise all available SfB features. However, this is also true today with features like Skype Broadcast Meeting.\nMS leaving the Contact Center space to partners. Users will use #skype4b for contact centers, Teams for everything else.\n\u0026mdash; Pat Richard - MVP 🕵🏼 (@patrichard) September 26, 2017 This is no surprise, there\u0026rsquo;s no Contact Centre integration with Skype for Business Online today. Big companies require Contact Centres, Call Recording \u0026amp; PCI Compliance which SfB Online and Teams can not do. This leaves a big hole in the Teams feature set for large businesses which will require a Hybrid to take full advantage of Telephony and Collaboration.\nWith Teams, the vision is to allow you to connect SBC directly to cloud, no CCE needed.\n\u0026mdash; C. Anthony Caragol (@CAnthonyCaragol) September 26, 2017 This will be music to the ears of traditional Telcos. The Microsoft vision is to connect your own SIP Trunks into Teams, this in my opinion is a very clever move from Microsoft. Telcos could move their customers to O365 Teams and keep the lines and minutes revenue that they would otherwise miss out on moving their customer to SfBo Cloud PBX.\nConclusion\nThe announcement of Teams from Microsoft is very exciting but also scary for someone like myself that has specialised in Skype for Business (I was once a Jack of All Trades). However I do take a lot of positives from Ignite. Teams / SfBo needs a lot of work, but if the future is an Office 365 platform that allows Direct SIP Trunking and provides APIs for service providers to wrap in Contact Centres, Call Recording, PCI/GDPR solutions (Maybe from Azure) then we\u0026rsquo;re in a good place.\nThere will be a lot of pain points for businesses to transition from SfBo to Teams, I\u0026rsquo;m still not sure that everyone in a business requires Teams. It\u0026rsquo;s designed around Creativity and Collaboration whereas most workers just need a telephone with IM\u0026amp;P, but we will see.\n","permalink":"https://chrishayward.co.uk/2017/09/26/microsoft-teams-and-skype-for-business-ignite-a-roundup-from-twitter/","summary":"\u003cp\u003eThe biggest news from Microsoft Ignite is the announcement of Microsoft Teams replacing Skype for Business Online.\u003c/p\u003e\n\u003cp\u003eThis has sent the Community, Skype for Business service providers and Integrators around the globe into a bit of a rumour mill.\u003c/p\u003e\n\u003cp\u003eSo the key point is \u003cstrong\u003eTeams\u003c/strong\u003e will replace \u003cstrong\u003eSkype for Business Online.\u003c/strong\u003e  Microsoft will be announcing a new version of \u003cstrong\u003eSkype for Business Server 2019\u003c/strong\u003e (Formerly LCS, OCS \u0026amp; Lync)  that we all know and love next year, however this will be for On-Prem customers (I.E. not in a Microsoft datacentre).  You will be able to have a Skype for Business and Teams Hybrid deployment.\u003c/p\u003e","title":"Microsoft Teams and Skype for Business – Ignite – A roundup from Twitter"},{"content":"If you don\u0026rsquo;t have Office 365 or are not using the Office 2016 Click To Run (CTR) software on your end users computers they may be missing out on some great new features.\nThe first great feature of the CTR version of Office 2016 is Consult and Transfer. Lync 2010, Lync 2013 and Skype for Business has desperately needed a Consult and Transfer button. In the past this was a complicated process for some users and I have had potential customers reject Lync and Skype for Business because the process wasn\u0026rsquo;t slick. I was always of the opinion you could drop a user an IM before transfering rather than making an actual call but some businesses insist they need this feature. Well, it\u0026rsquo;s here but you need to be running the Office 2016 CTR Skype for Business installed from the O365 portal.\nReference: Consult and Transfer\nThe next feature is the Skype Web App being available from the Skype Meeting Invite in Outlook. This is another feature that has been missing for years.\nThe problem starts with Federation. If a user sends a meeting Invite out to another SfB organisation and both organisations are not Federated, when the External Party clicks the \u0026ldquo;Join Skype Meeting\u0026rdquo; link it will fail. A Skype power user would know they could get around this by appending ?sl=1 to the meeting URL which will force the Skype Web App.\nYour average user would probably resort to the Dial-In Conference number and say \u0026ldquo;Hi, sorry my Lync/Skype wasn\u0026rsquo;t working so I\u0026rsquo;ve had to dial in\u0026rdquo;, followed mid-call with \u0026ldquo;Can you send me the PowerPoint via email as I can\u0026rsquo;t see it?\u0026rdquo;.\nThis is now resolved in the Office 2016 CTR version of Outlook in O365 where Microsoft have added a new line \u0026ldquo;Trouble Joining? Try Skype Web App\u0026rdquo;. This is the same URL as \u0026ldquo;Join Skype Meeting\u0026rdquo; with ?sl=1 appended.\nThis update also improves the Join via Phone link so the number is clickable.\nReference: Skype Web App\n","permalink":"https://chrishayward.co.uk/2017/07/28/skype-for-business-why-you-should-install-office-2016-ctr-rather-than-traditional-msi/","summary":"\u003cp\u003eIf you don\u0026rsquo;t have Office 365 or are not using the Office 2016 Click To Run (CTR) software on your end users computers they may be missing out on some great new features.\u003c/p\u003e\n\u003cp\u003eThe first great feature of the CTR version of Office 2016 is Consult and Transfer.  Lync 2010, Lync 2013 and Skype for Business has desperately needed a Consult and Transfer button.  In the past this was a complicated process for some users and I have had potential customers reject Lync and Skype for Business because the process wasn\u0026rsquo;t slick.  I was always of the opinion you could drop a user an IM before transfering  rather than making an actual call but some businesses insist they need this feature.   Well, it\u0026rsquo;s here but you need to be running the Office 2016 CTR Skype for Business installed from the O365 portal.\u003c/p\u003e","title":"Skype for Business – Why you should install Office 2016 CTR rather than traditional MSI"},{"content":"Every Lync/Skype admin has the same nightmare with Response Group Holiday sets, something that has to manually be programmed each year for Public Holidays in your country. What if you could script populating Holiday Sets automatically using PowerShell and an API?\nI live in England and most of my customers are UK based so I needed a service that would give me Public Holidays for the UK. Our government website lists all Public Holidays here: https://www.gov.uk/bank-holidays. They are also conveniently provided in JSON format here: https://www.gov.uk/bank-holidays.json\nI did look for a global service, but the one I found wanted $$$ to provide future Public Holidays: https://holidayapi.com/. This script is based on the GOV.UK website and UK bank holidays, but you could amend it to work with another JSON provider. Please also test in a Lab before rolling out to your live environment.\nWe can get the Public Holidays with PowerShell using Invoke-RestMethod:\nInvoke-RestMethod -Uri \u0026#34;https://www.gov.uk/bank-holidays.json\u0026#34; In this example I only want \u0026ldquo;england-and-wales\u0026rdquo; events which can be done as follows:\n$holidays = Invoke-RestMethod -Uri \u0026#34;https://www.gov.uk/bank-holidays.json\u0026#34; | Select-Object -expandproperty england-and-wales $holidays.events We can also disregard any Public Holidays that occurred in the past with an If statement:\n$holidays = Invoke-RestMethod -Uri \u0026#34;https://www.gov.uk/bank-holidays.json\u0026#34; | Select-Object -expandproperty england-and-wales ForEach ($hol in $holidays.events){ If (([DateTime]$hol.date) -gt $(get-date -Format yyyy-MM-dd)){ $hol } } Now you have the basics of getting Public Holidays with JSON and PowerShell, you can now wrap this up into a PowerShell script that runs the New-CsRgsHoliday and Set-CsRgsHolidaySet cmdlets. This can be ran as a scheduled task, maybe once a month is appropriate?\nSet PoolName and HolidaySetName.\n$PoolName = \u0026#34;FEPOOL.domain.local\u0026#34; $HolidaySetName = \u0026#34;England and Wales Bank Holidays\u0026#34; $holidays = Invoke-RestMethod -Uri \u0026#34;https://www.gov.uk/bank-holidays.json\u0026#34; | Select-Object -expandproperty england-and-wales # Get the Holiday Set $y = Try {Get-CsRgsHolidaySet -Identity \u0026#34;service:ApplicationServer:$PoolName\u0026#34; -Name $HolidaySetName}catch{$null} # Clear the current Holiday List if it exists (Stops duplicates) If ($y.name -eq $HolidaySetName){ $y.HolidayList.Clear() Set-CsRgsHolidaySet -Instance $y } ForEach ($hol in $holidays.events){ $StartDate = [DateTime]$hol.date $EndDate = $([DateTime]$hol.date).AddDays(1) # Ignore any previous public holidays If (([DateTime]$hol.date) -gt $(get-date -Format yyyy-MM-dd)){ $x = New-CsRgsHoliday -StartDate $StartDate -EndDate $EndDate -Name $hol.title # If the current Holiday set exists add day to Holiday List If ($y.name -eq $HolidaySetName){ $y.HolidayList.Add($x) Set-CsRgsHolidaySet -Instance $y }Else{ # Create the holiday set New-CsRgsHolidaySet -Parent \u0026#34;service:ApplicationServer:$PoolName\u0026#34; -Name $HolidaySetName -HolidayList($x) } } } Get-CsRgsHolidaySet | select -ExpandProperty HolidayList Output from final Get-CsRgsHolidaySet command\nEngland and Wales Bank Holidays now show in the Response Group Configuration Portal and should always be up to date. Again, test in a lab first.\n","permalink":"https://chrishayward.co.uk/2017/07/07/skype-for-business-automatically-set-rgs-holiday-sets-with-powershell-and-json/","summary":"\u003cp\u003eEvery Lync/Skype admin has the same nightmare with Response Group Holiday sets, something that has to manually be programmed each year for Public Holidays in your country.  What if you could script populating Holiday Sets automatically using PowerShell and an API?\u003c/p\u003e\n\u003cp\u003eI live in England and most of my customers are UK based so I needed a service that would give me Public Holidays for the UK.   Our government website lists all Public Holidays here: \u003ca href=\"https://www.gov.uk/bank-holidays\"\u003ehttps://www.gov.uk/bank-holidays\u003c/a\u003e.  They are also conveniently provided in JSON format here: \u003ca href=\"https://www.gov.uk/bank-holidays.json\"\u003ehttps://www.gov.uk/bank-holidays.json\u003c/a\u003e\u003c/p\u003e","title":"Skype for Business – Automatically set RGS Holiday Sets with PowerShell and JSON"},{"content":"During a side-by-side Lync 2013 to Skype for Business migration I encountered an error moving Response Groups using Move-CsRgsConfiguration.\nMove-CsRgsConfiguration -Source lyncfepool.domain.local -Destination skypefepool.domain.local This resulted in the error \u0026ldquo;Move-CsRgsConfiguration : Object reference not set to an instance of an object.\u0026rdquo;. To resolve I ran Move-CsRgsConfiguration again with the -verbose switch:\nMove-CsRgsConfiguration -Source lyncfepool.domain.local -Destination skypefepool.domain.local -verbose Verbose output below:\nVERBOSE: Performing the operation \u0026#34;Move-CsRgsConfiguration\u0026#34; on target \u0026#34;service:ApplicationServer:skypefepool.domain.local/531286fe-e965-4c1c-9949-26eca4d8d3db\u0026#34;. VERBOSE: Handle audio files... VERBOSE: Update associations with holiday sets... VERBOSE: Update associations with managers... Move-CsRgsConfiguration : Object reference not set to an instance of an object. At line:1 char:1 + Move-CsRgsConfiguration -Source lyncfepool.domain.local -Destination skyp ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : WriteError: (Microsoft.Rtc.R...lRgsDataContext:TransactionalRgsDataContext) [Move-CsRgsC onfiguration], NullReferenceException + FullyQualifiedErrorId : Microsoft.Rtc.Rgs.Management.MoveCsRgsConfigurationCmdlet VERBOSE: Rollback transaction. Next, I got the offending Response Group using Get-CsRgsWorkflow and the unique identification number from the Verbose output:\nGet-CsRgsWorkflow | where {$_.identity -like \u0026#34;*531286fe-e965-4c1c-9949-26eca4d8d3db*\u0026#34;} I then looked at this via the Response Group management portal (Control Panel \u0026gt; Response Groups \u0026gt; Workflow \u0026gt; Create or edit workflow) and it was apparent that it didn\u0026rsquo;t have queues associated with it and it was also disabled. I deleted the workflow and re-ran Move-CsRgsConfiguration which was now successful.\n","permalink":"https://chrishayward.co.uk/2017/07/03/skype-for-business-move-csrgsconfiguration-object-reference-not-set-to-an-instance-of-an-object/","summary":"\u003cp\u003eDuring a side-by-side Lync 2013 to Skype for Business migration I encountered an error moving Response Groups using Move-CsRgsConfiguration.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-powershell\" data-lang=\"powershell\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eMove-CsRgsConfiguration\u003c/span\u003e \u003cspan class=\"n\"\u003e-Source\u003c/span\u003e \u003cspan class=\"n\"\u003elyncfepool\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"py\"\u003edomain\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"py\"\u003elocal\u003c/span\u003e \u003cspan class=\"n\"\u003e-Destination\u003c/span\u003e \u003cspan class=\"n\"\u003eskypefepool\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"py\"\u003edomain\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"py\"\u003elocal\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThis resulted in the error \u0026ldquo;Move-CsRgsConfiguration : Object reference not set to an instance of an object.\u0026rdquo;.  To resolve I ran Move-CsRgsConfiguration again with the -verbose switch:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-powershell\" data-lang=\"powershell\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eMove-CsRgsConfiguration\u003c/span\u003e \u003cspan class=\"n\"\u003e-Source\u003c/span\u003e \u003cspan class=\"n\"\u003elyncfepool\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"py\"\u003edomain\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"py\"\u003elocal\u003c/span\u003e \u003cspan class=\"n\"\u003e-Destination\u003c/span\u003e \u003cspan class=\"n\"\u003eskypefepool\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"py\"\u003edomain\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"py\"\u003elocal\u003c/span\u003e \u003cspan class=\"n\"\u003e-verbose\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eVerbose output below:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eVERBOSE: Performing the operation \u0026#34;Move-CsRgsConfiguration\u0026#34; on target\n\u0026#34;service:ApplicationServer:skypefepool.domain.local/531286fe-e965-4c1c-9949-26eca4d8d3db\u0026#34;.\nVERBOSE: Handle audio files...\nVERBOSE: Update associations with holiday sets...\nVERBOSE: Update associations with managers...\nMove-CsRgsConfiguration : Object reference not set to an instance of an object.\nAt line:1 char:1\n+ Move-CsRgsConfiguration -Source lyncfepool.domain.local -Destination skyp ...\n+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n    + CategoryInfo          : WriteError: (Microsoft.Rtc.R...lRgsDataContext:TransactionalRgsDataContext) [Move-CsRgsC\n   onfiguration], NullReferenceException\n    + FullyQualifiedErrorId : Microsoft.Rtc.Rgs.Management.MoveCsRgsConfigurationCmdlet\n\nVERBOSE: Rollback transaction.\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003ca href=\"/wp-content/uploads/2017/07/Move-CsRgsConfig.jpg\"\u003e\u003cimg loading=\"lazy\" src=\"/wp-content/uploads/2017/07/Move-CsRgsConfig-1024x212.jpg\"\u003e\u003c/a\u003e\u003c/p\u003e","title":"Skype for Business – Move-CsRgsConfiguration : Object reference not set to an instance of an object."},{"content":"I recently had a customer that required 90 Common Area Phones creating in Skype for Business. This is quite a tedious task so the easiest way is to populate a CSV and use a PowerShell script to do the import.\nWhen creating a Common Area Phone in Lync/SfB it can take a few seconds before you\u0026rsquo;re able to assign Policies and Pin numbers to the objects. This slows the script down significantly if waiting 20 seconds between creating the object, then assigning Policies. So, I\u0026rsquo;ve actually made three ForEach loops, the first one creates the Common Area Phone objects, then it waits 20 seconds before assigning policies to every object, then it waits another 20 seconds before assigning the pins (I found that assigning Pins would fail if I didn\u0026rsquo;t wait longer).\nTip - To generate 90 pin numbers I used https://www.randomcodegenerator.com/en/generate-codes. Set Characters to \u0026ldquo;Digits\u0026rdquo; and Output Result to \u0026ldquo;Txt File\u0026rdquo;. You can then copy and paste into your CSV in Excel.\nHere is an example CSV file (CommonAreaPhones.csv):\nDisplayName,LineURI,Description,DisplayNumber,ConferencingPolicy,PinPolicy,VoicePolicy,DialPlan,Pin Test Phone1,tel:+44123456789,Test Phone1,+44123456789,Conf-CommonAreaHotDesk,Pin-CommonAreaHotDesk,UK National,SITEA,123987 Test Phone2,tel:+44123456780,Test Phone2,+44123456780,Conf-CommonAreaHotDesk,Pin-CommonAreaHotDesk,UK National,SITEB,123989 Here is the PowerShell script:\nNote - If the script fails assigning policies / pins due to not pausing long enough, you can hash out the \u0026ldquo;New-CsCommonAreaPhone\u0026rdquo; line and re-run the script to re-assign the policies and pins. You can also use this method if you need to change any policies.\n\u0026lt;# Author: Chris Hayward, chrishayward.co.uk Purpose: Script to bulk import Common Area Phones from CSV Version: 1.0 Changes: DATE - Change #\u0026gt; $filepath = \u0026#34;C:\\temp\\CommonAreaPhones.csv\u0026#34; #Specify path to CSV file $pool = \u0026#34;FEPOOL01.mydomain.local\u0026#34; #Specify Lync/Skype for Business Pool $ou = \u0026#34;ou=Common Area Phones,dc=mydomain,dc=local\u0026#34; #Specify OU CLS # First of all, lets create all of the Common Area Phone objects....... Import-CSV $filepath | Foreach-Object{ New-CsCommonAreaPhone -LineUri $_.LineURI -RegistrarPool $pool -OU $ou -Description $_.Description -DisplayName $_.DisplayName -DisplayNumber $_.DisplayNumber } # Next we wait 20 seconds before assigning policies Write-Output \u0026#34;Waiting 20 seconds\u0026#34; Start-Sleep -s 20 # Now lets assign policies to each Common Area Phone Import-CSV $filepath | Foreach-Object{ Grant-CsConferencingPolicy -PolicyName $_.ConferencingPolicy -Identity $_.DisplayName Grant-CsPINPolicy -PolicyName $_.PinPolicy -Identity $_.DisplayName Grant-CsVoicePolicy -PolicyName $_.VoicePolicy -Identity $_.DisplayName Grant-CsDialPlan -PolicyName $_.DialPlan -Identity $_.DisplayName } # Wait another 20 seconds for AD/Skype to catch up otherwise setting pin may fail Write-Output \u0026#34;Waiting 20 seconds\u0026#34; Start-Sleep -s 20 # Finally, set the pin numbers Import-CSV $filepath | Foreach-Object{ Set-CsClientPin –Identity $_.DisplayName -Pin $_.Pin } ","permalink":"https://chrishayward.co.uk/2017/01/11/skype-for-business-import-common-area-phones-from-csv/","summary":"\u003cp\u003eI recently had a customer that required 90 Common Area Phones creating in Skype for Business.  This is quite a tedious task so the easiest way is to populate a CSV and use a PowerShell script to do the import.\u003c/p\u003e\n\u003cp\u003eWhen creating a Common Area Phone in Lync/SfB it can take a few seconds before you\u0026rsquo;re able to assign Policies and Pin numbers to the objects.  This slows the script down significantly if waiting 20 seconds between creating the object, then assigning Policies.  So, I\u0026rsquo;ve actually made three ForEach loops, the first one creates the Common Area Phone objects, then it waits 20 seconds before assigning policies to every object, then it waits another 20 seconds before assigning the pins (I found that assigning Pins would fail if I didn\u0026rsquo;t wait longer).\u003c/p\u003e","title":"Skype for Business – Import Common Area Phones from CSV"},{"content":"The short answer is no, you require Exchange Unified Messaging, whether that is provided by Exchange 2010 SP3, 2013 2016 or Exchange Online.\nBut, what about if you deploy an Exchange server just to service Voicemail and forward the Voicemail on as an attachment to Lotus Notes, or any other email platform for that matter? *NOTE - You will need to license any users that have an Exchange Mailbox \u0026amp; UM.*\nThis isn\u0026rsquo;t a guide on how to setup Exchange and UM but here are some high level steps:\nYou set up an Exchange server, that\u0026rsquo;s Authoritative for a fictitious domain (E.g. Exchange.MyCompany.com) and an Internal Relay for your production domain (E.g. MyCompany.com). Your EmailAddress policy only applies the fictitious domain to users.\nYou set up Exchange UM as per the normal steps eg:\nNew-UMDialPlan -Name \u0026#34;MyCompany_UMDialPlan\u0026#34; -VoIPSecurity \u0026#34;Secured\u0026#34; -NumberOfDigitsInExtension 12 -URIType \u0026#34;SipName\u0026#34; -CountryOrRegionCode 1 Set-UMDialPlan \u0026#34;MyCompany_UMDialPlan\u0026#34; -ConfiguredInCountryOrRegionGroups \u0026#34;Anywhere,*,*,*\u0026#34; -AllowedInCountryOrRegionGroups \u0026#34;Anywhere\u0026#34; Set-UmService -Identity \u0026#34;EXCHANGEMBX01.MyCompany.local\u0026#34; -DialPlans \u0026#34;MyCompany_UMDialPlan\u0026#34; -UMStartupMode \u0026#34;Dual\u0026#34; Set-UMCallRouterSettings -Server \u0026#34;EXCHANGEMBX01.MyCompany.local\u0026#34; -UMStartupMode \u0026#34;Dual\u0026#34; -DialPlans \u0026#34;MyCompany_UMDialPlan\u0026#34; Get-UMMailboxPolicy | Set-UMMailboxPolicy -AllowedInCountryOrRegionGroups \u0026#34;Anywhere\u0026#34; -MinPINLength \u0026#34;5\u0026#34; -AllowCommonPatterns $false You set up a send connector from Exchange to your Domino Server(s) and enable Auto Forwarding to your production Domain: Get-RemoteDomain -Identity mycompany* | Set-RemoteDomain AutoForwardEnabled $True. Note, this Exchange Server has no public SMTP routing, it routes directly to the Domino Server.\nNext, how do you manage this going forwards? You need to do the following:\nEnable the users Exchange Mailbox Enable the users for Exchange Unified Messaging Configure the users Mailbox to forward to their Lotus Notes email address (Production domain) Or you could use a script and a scheduled task! This script assumes the EmailAddress attribute in AD is populated with the users Lotus Notes Email Address, although this could be any AD attribute.\nNOTE - When Exchange is enabled, the fictitious email address will override the \u0026ldquo;EmailAddress\u0026rdquo; attribute in AD. In my environment Skype and Exchange were in a Resource Forest and Microsoft Identity Manager automatically wrote the correct value back. You could write the original EmailAddress back to AD at the end of the script.\nFOR REFERENCE PURPOSES ONLY, USE AT YOUR OWN RISK.\n\u0026lt;# Author: Chris Hayward, chrishayward.co.uk Purpose: Script to bulk enable users for UM and configure forward to another SMTP address Version: 1.0 Changes: DATE - Change #\u0026gt; $EmailDomain = \u0026#34;MyCompany.Com\u0026#34; $UMMailboxPolicy = \u0026#34;MyCompany_UMDialPlan Default Policy\u0026#34; $strLogPath = \u0026#34;c:\\_Scripts\\AutoEnable-UM\\Logs\\\u0026#34; # E.g. \u0026#34;\\\\myserver\\myshare\\mylogs\\\u0026#34; # Start Script $strDate = (Get-Date).tostring(\u0026#34;yyyyMMdd\u0026#34;) $strLogFile = $strLogPath + $strDate + \u0026#34;_CreationLog.log\u0026#34; # Log file ## Get all users that have an email address that matches $EMailDomain and has a Lync/Skype LineURI (E.G They are Enterprise Voice Enabled) $NonUMUsers = Get-ADUser -Filter \u0026#34;EmailAddress -like \u0026#39;*@$EmailDomain\u0026#39; -and msRTCSIP-Line -like \u0026#39;tel:+*\u0026#39;\u0026#34; -Properties SamAccountName, Mail, MSRTCSIP-Line ## Lets exit if there\u0026#39;s nothing to do If ($NonUMUsers.count -lt 1){ Write-Host \u0026#34;No new users to enable\u0026#34; exit } ## Start the Log file Start-Transcript -path $strLogFile -Append ForEach ($User in $NonUMUsers){ ## Enable mailbox $Mailbox = Get-Mailbox -Identity $($User.SamAccountName) If ($Mailbox.IsMailboxEnabled -ne \u0026#39;True\u0026#39;){ Write-Host \u0026#34;Enable Mailbox\u0026#34; Enable-Mailbox -Identity $($User.SamAccountName) } ## Get the LineURI into the correct format for UM (NOTE I\u0026#39;m taking the tel:+ off and using the full 12 digits for the UK eg 441234567890) $Extension = $User.\u0026#39;MSRTCSIP-Line\u0026#39; -split \u0026#39;\\+\u0026#39; $Extension = $Extension[1] ##Enable Exchange UM (Will probably fail the first time so we will keep trying until the mailbox is ready) $UMMailbox = Get-UMMailbox -Identity $($User.SamAccountName) While ($($UMMailbox.UMEnabled) -ne \u0026#39;True\u0026#39;){ Start-Sleep -s 10 Write-Host \u0026#34;No UM yet, keep trying\u0026#34; Get-Mailbox -Identity $($User.SamAccountName) | Enable-UMMailbox -UMMailboxPolicy $UMMailboxPolicy -Extensions $Extension $UMMailbox = Get-UMMailbox -Identity $($User.SamAccountName) } #Here we set the Mailbox to forward to the Email Address populated in AD (Keep trying if it fails first time) $MailForward = Get-Mailbox -Identity $($User.SamAccountName) While ($($MailForward.ForwardingSMTPAddress) -notlike \u0026#39;smtp*\u0026#39;){ Start-Sleep -s 10 Write-Host \u0026#34;No forward yet, keep trying\u0026#34; Set-Mailbox -Identity $($User.SamAccountName) -ForwardingSMTPAddress $($User.Mail) $MailForward = Get-Mailbox -Identity $($User.SamAccountName) } } Stop-Transcript exit ","permalink":"https://chrishayward.co.uk/2017/01/09/skype-for-business-can-i-have-voicemail-if-i-use-lotus-notes/","summary":"\u003cp\u003eThe short answer is no, you require Exchange Unified Messaging, whether that is provided by Exchange 2010 SP3, 2013 2016 or Exchange Online.\u003c/p\u003e\n\u003cp\u003eBut, what about if you deploy an Exchange server just to service Voicemail and forward the Voicemail on as an attachment to Lotus Notes, or any other email platform for that matter? *\u003cstrong\u003eNOTE\u003c/strong\u003e - You will need to license any users that have an Exchange Mailbox \u0026amp; UM.*\u003c/p\u003e","title":"Skype for Business – Can I have Voicemail if I use Lotus Notes?"},{"content":"After Microsoft released Microsoft Teams yesterday I tried to install it on my company issued laptop (Windows 8.1 64bit). Upon opening Teams I was greeted with the following error:\n\u0026ldquo;The program can\u0026rsquo;t start because MSVCP140.dll is missing from your computer. Try reinstalling the program to fix this problem\u0026rdquo;\nThe fix was to install the Microsoft Visual C++ Redistributable for Visual Studio 2015 available here: https://www.microsoft.com/en-us/download/details.aspx?id=48145\n","permalink":"https://chrishayward.co.uk/2016/11/04/office-365-teams-the-program-cant-start-because-msvcp140-dll-is-missing/","summary":"\u003cp\u003eAfter Microsoft released Microsoft Teams yesterday I tried to install it on my company issued laptop (Windows 8.1 64bit).  Upon opening Teams I was greeted with the following error:\u003c/p\u003e\n\u003cp\u003e\u0026ldquo;The program can\u0026rsquo;t start because MSVCP140.dll is missing from your computer. Try reinstalling the program to fix this problem\u0026rdquo;\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/wp-content/uploads/2016/11/O365-Teams-Error.jpg\"\u003e\u003cimg alt=\"o365-teams-error\" loading=\"lazy\" src=\"/wp-content/uploads/2016/11/O365-Teams-Error.jpg\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eThe fix was to install the Microsoft Visual C++ Redistributable for Visual Studio 2015 available here: \u003ca href=\"https://www.microsoft.com/en-us/download/details.aspx?id=48145\"\u003ehttps://www.microsoft.com/en-us/download/details.aspx?id=48145\u003c/a\u003e\u003c/p\u003e","title":"Office 365 – Microsoft Teams The program can't start because MSVCP140.dll is missing"},{"content":"We recently came across an issue where a customer could not sign-in to a Microsoft Surface Hub.\nThere\u0026rsquo;s a great article here: https://ucsorted.com/2015/08/31/understanding-user-mapping-in-a-skype-for-business-resource-forest/ explaining how a Resource Forest model works.\nWhen you enable a SfB user, the proxyAddresses attribute is populated with the users SIP address in the format SIP:name@domain.com. In a Resource Forest model this is populated on the disabled user object in the Resource Forest. Usually the attribute flow is one way from the User Forest to the Resource Forest so the SIP: value never populates the proxyAddresses attribute in the User Forest.\nTo resolve we added the correct SIP: value to proxyAddresses on the Surface Hubs AD account in the User Forest.\n","permalink":"https://chrishayward.co.uk/2016/11/04/skype-for-business-resource-forest-and-surface-hub-sign-in/","summary":"\u003cp\u003eWe recently came across an issue where a customer could not sign-in to a Microsoft Surface Hub.\u003c/p\u003e\n\u003cp\u003eThere\u0026rsquo;s a great article here: \u003ca href=\"https://ucsorted.com/2015/08/31/understanding-user-mapping-in-a-skype-for-business-resource-forest\"\u003ehttps://ucsorted.com/2015/08/31/understanding-user-mapping-in-a-skype-for-business-resource-forest\u003c/a\u003e/ explaining how a Resource Forest model works.\u003c/p\u003e\n\u003cp\u003eWhen you enable a SfB user, the proxyAddresses attribute is populated with the users SIP address in the format SIP:name@domain.com.  In a Resource Forest model this is populated on the disabled user object in the Resource Forest.   Usually the attribute flow is one way from the User Forest to the Resource Forest so the SIP: value never populates the proxyAddresses attribute in the User Forest.\u003c/p\u003e","title":"Skype for Business – Resource Forest and Surface Hub sign-in"},{"content":"I was recently installing the latest Skype4B CU and came across a strange issue where one of the updates would not install. The error message I received was:\n\u0026ldquo;Skype for Business Server 2015 Update Installer: There were errors during the installation process. For details, see the log file atC:\\Users\\chris\\AppData\\Local\\Temp\\Skype_patchinstallerlog-FE01-[2016-08-01][15-28-31].txt\u0026rdquo;\nChecking the log files indicated an error 1603. A bit of googling led me to various blog posts advising to ensure all MMCs were closed, checking there was enough disk space on the Front End and also running the Deployment Wizard again. None of these solutions worked for me, I tried running the installer from an elevated prompt and also tried installing server.msp manually.\n**Skype_patchinstallerlog-FE01-[2016-08-01][14-53-44].txt\n**\n_[01/08/2016 15:05:54] Executing command: msiexec.exe /update \u0026ldquo;C:\\Users\\chris\\AppData\\Local\\Temp\\Server.msp\u0026rdquo; /passive /norestart /l*vx \u0026ldquo;C:\\Users\\chris\\AppData\\Local\\Temp\\Server.msp-FE01-[2016-08-01][15-05-54]_log.txt\u0026rdquo;\n[01/08/2016 15:06:22] ERROR 1603: Server.msp had errors installing.\n[01/08/2016 15:07:12] ERROR: SkypeServerUpdateInstaller failed to successfully install all patches\n_\n**Server.msp-FE01-[2016-08-01][15-05-54]_log.txt\n**\n_MSI (c) (0C:44) [15:06:22:801]: MainEngineThread is returning 1603\n_\n**LCSSetup_Commands.log\n**\n_08/01/201615:06:11\npowershell -noprofile -command \u0026quot; \u0026amp; Install-CsDatabase -Update -DatabaseType Registrar -Verbose \u0026quot;\n-\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;-\n\u0026amp; : The term \u0026lsquo;Install-CsDatabase\u0026rsquo; is not recognized as the name of a cmdlet,\nfunction, script file, or operable program. Check the spelling of the name, or\nif a path was included, verify that the path is correct and try again.\nAt line:1 char:4\n+ \u0026amp; Install-CsDatabase -Update -DatabaseType Registrar -Verbose\n+ ~~~~~~~~~~~~~~~~~~\n+ CategoryInfo : ObjectNotFound: (Install-CsDatabase:String) [],\nCommandNotFoundException\n+ FullyQualifiedErrorId : CommandNotFoundException\n_\nLCSSetup_Commands.log gave the biggest clue, server.msp was running an \u0026ldquo;Install-CsDatabase\u0026rdquo; PowerShell command and an error was returned stating the term \u0026ldquo;Install-CsDatabase\u0026rdquo; is not recognized as the name of a cmdlet. When I tested a SfB command from the Skype for Business Management Shell it worked 100% fine. When I tested the command from a Windows PowerShell prompt it failed. Note PowerShell V3 should automatically load modules so I wasn\u0026rsquo;t 100% sure why this wasn\u0026rsquo;t working. If I ran \u0026ldquo;Import-Module Lync\u0026rdquo;, then the SfB cmdlets all worked fine. I then tried running the update installer from a SfB Management Shell (as this worked) and also tried creating a PowerShell profile in System32\\WindowsPowerShell to automatically load the Lync module when you open PowerShell.exe. Although this worked for my user, the update still failed!\nHere you can see Get-CsWindowsService failing in a normal Windows PowerShell session, what was interesting was tabbing this command worked fine so PS was picking up the SfB module cmdlets:\nHere I ran $env:psmodulepath –split \u0026ldquo;;\u0026rdquo; to list all directories PowerShell will automatically import modules from (As you can see Skype for Business is there):\nHere I opened WPS and ran \u0026ldquo;Get-Module\u0026rdquo;, it is normal to only see the one Manifest until you run a command, WPS v3 will then Import the relevant module automatically. I then ran Get-CsWindowsService again, and ran \u0026ldquo;Get-Module\u0026rdquo; after it failed.\nBingo, why has Get-CsWindowsService triggered WPS to try and load a SFBTrial module rather than the correct Skype for Business module? SFBTrial is a custom PowerShell module we wrote. It\u0026rsquo;s actually pretty neat, before a customer purchases Skype for Business we utilise this environment as a trial/demo platform. The SFBTrial module takes care of Creating test users, OUs, Address Book segregation and also disabling accounts after the trial period. However, it seems to be causing me a bit of bother installing updates!\nI removed the \u0026ldquo;SFBTrial\u0026rdquo; custom Module from C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\Modules.\nAfter this module was removed, below you can see Get-CsWindowsService automatically loading the Skype for Business Module.\nRe-running the Skype for Business Update Installer was now successful.\n","permalink":"https://chrishayward.co.uk/2016/08/02/skype-for-business-update-installer-there-were-errors-during-the-installation-process/","summary":"\u003cp\u003eI was recently installing the latest Skype4B CU and came across a strange issue where one of the updates would not install. The error message I received was:\u003c/p\u003e\n\u003cp\u003e\u003cspan style=\"color: red;\"\u003e\u003cem\u003e\u0026ldquo;Skype for Business Server 2015 Update Installer: There were errors during the installation process. For details, see the log file atC:\\Users\\chris\\AppData\\Local\\Temp\\Skype_patchinstallerlog-FE01-[2016-08-01][15-28-31].txt\u0026rdquo;\u003cbr\u003e\u003c/em\u003e\u003c/span\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/wp-content/uploads/2016/08/080216_1240_SkypeforBus1.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/wp-content/uploads/2016/08/080216_1240_SkypeforBus2.png\"\u003e\u003c/p\u003e\n\u003cp\u003eChecking the log files indicated an error 1603. A bit of googling led me to various blog posts advising to ensure all MMCs were closed, checking there was enough disk space on the Front End and also running the Deployment Wizard again. None of these solutions worked for me, I tried running the installer from an elevated prompt and also tried installing server.msp manually.\u003c/p\u003e","title":"Skype for Business – Update Installer – There were errors during the installation process."},{"content":"On your current farm run \u0026ldquo;Get-OfficeWebAppsFarm\u0026rdquo;. Make a note of the InternalURL, ExternalURL, CertificateName and Machines (Note you may only have the ExternalURL configured). E.g.\nInternalURL: https://webapps.mycompany.local\nExternalURL: https://webapps.mycompany.com\nCertificateName: My WAC Certificate\nMachines: WebApps01, WebApps02\nRun \u0026ldquo;Get-OfficeWebAppsHost\u0026rdquo;. Make a note of the allowList. E.g.\nallowList: mycompany.com, mycompany.local\nOn each Office Web Apps 2013 server:\nUninstall \u0026ldquo;Microsoft Office Web Apps Server 2013\u0026rdquo; Install Windows Identity Foundation 3.5 (Add Roles and Features \u0026gt; Features) Install the Update for Universal C Runtime in Windows KB (https://support.microsoft.com/en-gb/kb/2999226) Install Microsoft Office Online Server 2016 Using the information you gathered from Get-OfficeWebAppsFarm, on the first machine in the farm (WebApps01) run New-OfficeWebAppsFarm, E.g.\nNew-OfficeWebAppsFarm -InternalURL https://webapps.mycompany.local -ExternalURL https://webapps.mycompany.com -CertificateName \u0026ldquo;My WAC Certificate\u0026rdquo;\nFor each domain gathered from Get-OfficeWebAppsHost run NewOfficeWebAppsHost, E.g.\nNew-OfficeWebAppsHost -Domain mycompany.com\nNew-OfficeWebAppsHost -Domain mycompany.local\nFor each additional Machine in the farm, log on locally, open PowerShell and run New OfficeWebAppsMachine, E.g.\nNew-OfficeWebAppsMachine -MachineToJoin WebApps01\nYou can test your Office Online Server farm is working by navigating to https://webapps.mycompany.com/hosting/discovery\n","permalink":"https://chrishayward.co.uk/2016/06/17/how-to-upgrade-office-web-apps-2013-to-office-online-server-2016/","summary":"\u003cp\u003eOn your current farm run \u0026ldquo;\u003cspan style=\"color: #ff0000;\"\u003eGet-OfficeWebAppsFarm\u003c/span\u003e\u0026rdquo;. Make a note of the InternalURL, ExternalURL, CertificateName and Machines (Note you may only have the ExternalURL configured). E.g.\u003cbr\u003e\n\u003cspan style=\"color: #3366ff;\"\u003e\u003cem\u003eInternalURL: \u003ca href=\"https://webapps.mycompany.local\"\u003ehttps://webapps.mycompany.local\u003c/a\u003e\u003c/em\u003e\u003c/span\u003e\u003cbr\u003e\n\u003cspan style=\"color: #3366ff;\"\u003e\u003cem\u003eExternalURL: \u003ca href=\"https://webapps.mycompany.com\"\u003ehttps://webapps.mycompany.com\u003c/a\u003e\u003c/em\u003e\u003c/span\u003e\u003cbr\u003e\n\u003cspan style=\"color: #3366ff;\"\u003e\u003cem\u003eCertificateName: My WAC Certificate\u003c/em\u003e\u003c/span\u003e\u003cbr\u003e\n\u003cspan style=\"color: #3366ff;\"\u003e\u003cem\u003eMachines: WebApps01, WebApps02\u003c/em\u003e\u003c/span\u003e\u003c/p\u003e\n\u003cp\u003eRun \u0026ldquo;\u003cspan style=\"color: #ff0000;\"\u003eGet-OfficeWebAppsHost\u003c/span\u003e\u0026rdquo;. Make a note of the allowList. E.g.\u003cbr\u003e\n\u003cspan style=\"color: #3366ff;\"\u003e\u003cem\u003eallowList: mycompany.com, mycompany.local\u003c/em\u003e\u003c/span\u003e\u003c/p\u003e\n\u003cp\u003eOn each Office Web Apps 2013 server:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eUninstall \u0026ldquo;Microsoft Office Web Apps Server 2013\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eInstall Windows Identity Foundation 3.5 (Add Roles and Features \u0026gt; Features)\u003c/li\u003e\n\u003cli\u003eInstall the Update for Universal C Runtime in Windows KB (\u003ca href=\"https://support.microsoft.com/en-gb/kb/2999226\"\u003ehttps://support.microsoft.com/en-gb/kb/2999226\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eInstall Microsoft Office Online Server 2016\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eUsing the information you gathered from Get-OfficeWebAppsFarm, on the first machine in the farm (WebApps01) run New-OfficeWebAppsFarm, E.g.\u003cbr\u003e\n\u003cspan style=\"color: #ff0000;\"\u003eNew-OfficeWebAppsFarm -InternalURL \u003ca href=\"https://webapps.mycompany.local\"\u003ehttps://webapps.mycompany.local\u003c/a\u003e -ExternalURL \u003ca href=\"https://webapps.mycompany.com\"\u003ehttps://webapps.mycompany.com\u003c/a\u003e -CertificateName \u0026ldquo;My WAC Certificate\u0026rdquo;\u003c/span\u003e\u003c/p\u003e","title":"How To: Upgrade Office Web Apps 2013 to Office Online Server 2016"},{"content":"Microsoft recently released Office Online Server to replace Office Web Apps. OOS allows you to use Word, Excel, PowerPoint and OneNote from your browser. Lync and Skype for Business utilise OOS for enhanced PowerPoint sharing.\nAll Microsoft articles advise to download Office Online Server from the Volume Licensing Service Center, however it\u0026rsquo;s quite difficult to find. Try searching for \u0026ldquo;Office\u0026rdquo;, \u0026ldquo;Office Online\u0026rdquo;, \u0026ldquo;Online\u0026rdquo; and you won\u0026rsquo;t find an \u0026ldquo;Office Online Server\u0026rdquo; download. That\u0026rsquo;s because it\u0026rsquo;s actually part of Office Professional Plus 2016.\nYou need to find Office Pro Plus 2016 \u0026amp; select 64bit as the Operating System type. The Office Online Server ISO will then appear in the files that you can download.\n","permalink":"https://chrishayward.co.uk/2016/06/14/skype-for-business-office-online-server-iso-download/","summary":"\u003cp\u003eMicrosoft recently released Office Online Server to replace Office Web Apps.  OOS allows you to use Word, Excel, PowerPoint and OneNote from your browser.  Lync and Skype for Business utilise OOS for enhanced PowerPoint sharing.\u003c/p\u003e\n\u003cp\u003eAll Microsoft articles advise to download Office Online Server from the Volume Licensing Service Center, however it\u0026rsquo;s quite difficult to find.  Try searching for \u0026ldquo;Office\u0026rdquo;, \u0026ldquo;Office Online\u0026rdquo;, \u0026ldquo;Online\u0026rdquo; and you won\u0026rsquo;t find an \u0026ldquo;Office Online Server\u0026rdquo; download.  That\u0026rsquo;s because it\u0026rsquo;s actually part of Office Professional Plus 2016.\u003c/p\u003e","title":"Skype for Business – Office Online Server ISO Download"},{"content":"Back in 2012 I wrote a post on how to hide Response Groups from the Address Book in Lync 2010 using ADSI Edit. The same process also applied to Lync 2013. Original Article: /2012/10/16/hiding-response-groups-from-address-book-lync-server-2010/\nThe original article involved finding the Response Group AD Object manually using ADSI Edit and changing the msExchHideFromAddressLists (Exchange property) to TRUE. You could then run Update-CSAddressbook and Lync clients would pickup the change within due course.\nThe same principle applies in Skype for Business, however you can change the msExchHideFromAddressLists property to TRUE much easier using PowerShell. It\u0026rsquo;s worth pointing out that the Application Contacts used by the Response Group service may be in the System Container or the Configuration Container depending on whether you have had OCS or earlier installed (someone may correct me on that).\nSystem Container: CN=Application Contacts, CN=RTC Service, CN=Microsoft,CN=System,DC=domain,DC=local\nConfiguration Container: CN=Application Contacts, CN=RTC Service, CN=Services,CN=Configuration,DC=domain,DC=local\nTo run the PowerShell command modify the search base to match the Distinguished name of your Application Contacts container and change the SIP address to match the Response Group you wish to hide.\nGet-ADObject -SearchBase \u0026#34;CN=Application Contacts,CN=RTC Service,CN=Services,CN=Configuration,DC=Domain,DC=Local\u0026#34; -Filter {msRTCSIP-PrimaryUserAddress -eq \u0026#34;sip:my.rgs@mydomain.com\u0026#34;} | Set-AdObject -replace @{msExchHideFromAddressLists=$true} This method is a lot easier!\n","permalink":"https://chrishayward.co.uk/2016/04/15/skype-for-business-hide-response-group-from-address-book/","summary":"\u003cp\u003eBack in 2012 I wrote a post on how to hide Response Groups from the Address Book in Lync 2010 using ADSI Edit.  The same process also applied to Lync 2013.  Original Article: \u003ca href=\"/2012/10/16/hiding-response-groups-from-address-book-lync-server-2010/\"\u003e/2012/10/16/hiding-response-groups-from-address-book-lync-server-2010/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eThe original article involved finding the Response Group AD Object manually using ADSI Edit and changing the msExchHideFromAddressLists (Exchange property) to TRUE.  You could then run Update-CSAddressbook and Lync clients would pickup the change within due course.\u003c/p\u003e","title":"Skype for Business – Hide Response Group from Address Book"},{"content":"I recently came across an issue with Lync 2013 where SCOM (System Center Operations Manager) was periodically reporting errors with the Conferencing Attendant and IM MCU. The SCOM errors were as follows:\nAlert: [LYNC] Conferencing Attendant failed to join the conference. Source: LS Conferencing Auto Attendant Component [F05.DOMAIN.LOCAL] Path: FE05.DOMAIN.LOCAL Last modified by: System Last modified time: 4/11/2016 11:01:50 AM Alert description: Conferencing Attendant failed to join the conference. Microsoft.Rtc.Signaling.ConnectionFailureException:Operation failed because the network connection was not available. ---\u0026gt; Microsoft.Rtc.Internal.Sip.TLSException: TLS Negotiation took too long to complete Alert: [LYNC] Lync Server IM MCU failed to connect to the SIP Front End. Source: LS Instant Message Conferencing Component [FE03.DOMAIN.LOCAL] Path: FE03.DOMAIN.LOCAL Last modified by: System Last modified time: 4/11/2016 11:35:24 AM Alert description: Lync Server IM MCU failed to connect to the SIP Front End. Local Machine name: FE03.DOMAIN.LOCAL FE hostname: FE06.DOMAIN.LOCAL IP address: 10.10.10.13:5061 Message: TLS Negotiation took too long to complete Strangely, no users had reported issues and initial thoughts were performance problems with the Lync Front End servers. This is quite a large Pool with 7 Front Ends and each Front End would periodically generate the above errors in SCOM. All servers were running the latest CU and all certificates were valid for 2 years.\nThese errors could also be seen in the Lync event logs on each Front End:\nLog Name: Lync Server Source: LS Conferencing Announcement Service Date: 2/10/2016 1:05:07 PM Event ID: 33129 Task Category: (1301) Level: Error Keywords: Classic User: N/A Computer: FE04.DOMAIN.LOCAL Description: Conferencing Announcement Service could not negotiate TLS and failed to establish a SIP connection. Reason=Other (1460). Front End=FEPOOL01.DOMAIN.LOCAL. Cause: This issue may occur due to TLS certificates on the Microsoft Lync Server 2013 Front End and the Conferencing Announcement Service being expired, or not in sync. Resolution: Check and resolve certificate issues, mismatches between the Microsoft Lync Server 2013 Front End and Conferencing Announcement Service to restore connectivity. Event Xml: \u0026lt;Event xmlns=\u0026#34;http://schemas.microsoft.com/win/2004/08/events/event\u0026#34;\u0026gt; \u0026lt;System\u0026gt; \u0026lt;Provider Name=\u0026#34;LS Conferencing Announcement Service\u0026#34; /\u0026gt; \u0026lt;EventID Qualifiers=\u0026#34;50453\u0026#34;\u0026gt;33129\u0026lt;/EventID\u0026gt; \u0026lt;Level\u0026gt;2\u0026lt;/Level\u0026gt; \u0026lt;Task\u0026gt;1301\u0026lt;/Task\u0026gt; \u0026lt;Keywords\u0026gt;0x80000000000000\u0026lt;/Keywords\u0026gt; \u0026lt;TimeCreated SystemTime=\u0026#34;2016-02-10T13:05:07.000000000Z\u0026#34; /\u0026gt; \u0026lt;EventRecordID\u0026gt;129050\u0026lt;/EventRecordID\u0026gt; \u0026lt;Channel\u0026gt;Lync Server\u0026lt;/Channel\u0026gt; \u0026lt;Computer\u0026gt;FE04.DOMAIN.LOCAL\u0026lt;/Computer\u0026gt; \u0026lt;Security /\u0026gt; \u0026lt;/System\u0026gt; \u0026lt;EventData\u0026gt; \u0026lt;Data\u0026gt;Other (1460)\u0026lt;/Data\u0026gt; \u0026lt;Data\u0026gt;FEPOOL01.DOMAIN.LOCAL\u0026lt;/Data\u0026gt; \u0026lt;/EventData\u0026gt; \u0026lt;/Event\u0026gt; Log Name: Lync Server Source: LS IM MCU Date: 2/9/2016 6:02:34 PM Event ID: 33019 Task Category: (1019) Level: Error Keywords: Classic User: N/A Computer: FE06.DOMAIN.LOCAL Description: Lync Server IM MCU failed to connect to the SIP Front End. Local Machine name: FE06.DOMAIN.LOCAL FE hostname: FE05.DOMAIN.LOCAL IP address: 10.10.10.12:5061 Message: Peer disconnected while outbound TLS negotiation was in progress Stack: Cause: Lync Server IM MCU cannot communicate with the Microsoft Lync Server 2013 Front End Service over SIP due to network connectivity issues or unavailability of the Microsoft Lync Server 2013 Front End Service. This condition prevents setting up new conferencing sessions, forwarding Instant Messages and is disruptive and potentially fatal for existing conferencing sessions. Resolution: Please ensure network connectivity and availability of the Microsoft Lync Server 2013 Front End Service for the IM Conferencing Service to be able to function correctly. Event Xml: \u0026lt;Event xmlns=\u0026#34;http://schemas.microsoft.com/win/2004/08/events/event\u0026#34;\u0026gt; \u0026lt;System\u0026gt; \u0026lt;Provider Name=\u0026#34;LS IM MCU\u0026#34; /\u0026gt; \u0026lt;EventID Qualifiers=\u0026#34;50171\u0026#34;\u0026gt;33019\u0026lt;/EventID\u0026gt; \u0026lt;Level\u0026gt;2\u0026lt;/Level\u0026gt; \u0026lt;Task\u0026gt;1019\u0026lt;/Task\u0026gt; \u0026lt;Keywords\u0026gt;0x80000000000000\u0026lt;/Keywords\u0026gt; \u0026lt;TimeCreated SystemTime=\u0026#34;2016-02-09T18:02:34.000000000Z\u0026#34; /\u0026gt; \u0026lt;EventRecordID\u0026gt;77079\u0026lt;/EventRecordID\u0026gt; \u0026lt;Channel\u0026gt;Lync Server\u0026lt;/Channel\u0026gt; \u0026lt;Computer\u0026gt;FE06.DOMAIN.LOCAL\u0026lt;/Computer\u0026gt; \u0026lt;Security /\u0026gt; \u0026lt;/System\u0026gt; \u0026lt;EventData\u0026gt; \u0026lt;Data\u0026gt;FE06.DOMAIN.LOCAL\u0026lt;/Data\u0026gt; \u0026lt;Data\u0026gt;FE05.DOMAIN.LOCAL\u0026lt;/Data\u0026gt; \u0026lt;Data\u0026gt;10.10.10.12:5061\u0026lt;/Data\u0026gt; \u0026lt;Data\u0026gt;Peer disconnected while outbound TLS negotiation was in progress\u0026lt;/Data\u0026gt; \u0026lt;Data\u0026gt; \u0026lt;/Data\u0026gt; \u0026lt;/EventData\u0026gt; \u0026lt;/Event\u0026gt; It transpired that the Lync Front End servers could not access the CRL (Certificate Revocation List) due to Firewalls between the Lync servers and the customers Certificate Authority. You can view the CRL distribution points via the certificate Details tab, example below (Note the CRL may also be published via LDAP internally):\nYou can check Lync servers have successfully accessed the CRL by running: certutil -urlcache CRL. If the CRL has been accessed you will see it in the list returned.\nYou can also verify if the Lync servers can access the CRL by doing the following:\nExport Front End certificate from MMC to C:\\temp\\LyncFE.cer (No need to export Private Key) Run from elevated command prompt: certutil.exe -v -verify -URLfetch c:\\temp\\LyncFE.cer \u0026gt; C:\\temp\\certutil.txt Open certutil.txt from C:\\temp If the CRL can\u0026rsquo;t be accessed you will see the following error towards the bottom of the file: ERROR: Verifying leaf certificate revocation status returned The revocation function was unable to check revocation because the revocation server was offline. 0x80092013 (-2146885613 CRYPT_E_REVOCATION_OFFLINE)\nIf the CRL can be accessed you will see the following towards the bottom of the file: Leaf certificate revocation check passed\nOnce the Firewall ports were opened between Lync and the CA server hosting the CRL the TLS Timeout Errors in the Lync Event logs and SCOM stopped. It is likely that if you see this issue in Skype for Business 2015, it\u0026rsquo;s also caused by the CRL being inaccessible.\n","permalink":"https://chrishayward.co.uk/2016/04/13/lync-2013-tls-negotiation-took-too-long-to-complete/","summary":"\u003cp\u003eI recently came across an issue with Lync 2013 where SCOM (System Center Operations Manager) was periodically reporting errors with the Conferencing Attendant and IM MCU.  The SCOM errors were as follows:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eAlert: [LYNC] Conferencing Attendant failed to join the conference.\nSource: LS Conferencing Auto Attendant Component [F05.DOMAIN.LOCAL]\nPath: FE05.DOMAIN.LOCAL\nLast modified by: System\nLast modified time: 4/11/2016 11:01:50 AM Alert description: Conferencing Attendant failed to join the conference.\n\nMicrosoft.Rtc.Signaling.ConnectionFailureException:Operation failed because the network connection was not available. ---\u0026gt; Microsoft.Rtc.Internal.Sip.TLSException: TLS Negotiation took too long to complete\n\u003c/code\u003e\u003c/pre\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eAlert: [LYNC] Lync Server IM MCU failed to connect to the SIP Front End.\nSource: LS Instant Message Conferencing Component [FE03.DOMAIN.LOCAL]\nPath: FE03.DOMAIN.LOCAL\nLast modified by: System\nLast modified time: 4/11/2016 11:35:24 AM Alert description: Lync Server IM MCU failed to connect to the SIP Front End.\n\nLocal Machine name: FE03.DOMAIN.LOCAL FE hostname: FE06.DOMAIN.LOCAL IP address: 10.10.10.13:5061 Message: TLS Negotiation took too long to complete\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eStrangely, no users had reported issues and initial thoughts were performance problems with the Lync Front End servers.  This is quite a large Pool with 7 Front Ends and each Front End would periodically generate the above errors in SCOM.  All servers were running the latest CU and all certificates were valid for 2 years.\u003c/p\u003e","title":"Lync 2013 – TLS Negotiation took too long to complete"},{"content":"When configuring QoS (Quality of Service) in Microsoft Lync / Skype for Business you need to modify the media port ranges for various Services and Configuration using PowerShell.\nPat Richard has made a brilliant QoS calculator for Lync/Skype for Business here http://www.ehloworld.com/2821. The calculator will provide you with the PowerShell commands required to configure QoS port ranges and the GPO\u0026rsquo;s. The calculator also gives you the commands to verify the Configuration (which this post is based on).\nI needed to verify the QoS configuration on a customers environment with multiple pools. The PowerShell script below will run all of the verify commands in Pat\u0026rsquo;s script against all pools.\nWrite-Host \u0026#34;Client P2P Ports - Ignore ClientSipDynamicPort/Range and ClientMediaPort/Range values\u0026#34; -ForegroundColor DarkYellow Get-CsConferencingConfiguration -Identity global | Format-List Identity,*port* Write-Host \u0026#34;Conferencing Server Ports\u0026#34; -ForegroundColor DarkYellow Get-CsService -ConferencingServer | Format-List Identity,AppSharingPortStart,AppSharingPortCount,AudioPortStart,AudioPortCount,VideoPortStart,VideoPortCount Write-Host \u0026#34;Application Server Ports\u0026#34; -ForegroundColor DarkYellow Get-CsService -ApplicationServer | Format-List Identity,AppSharingPortStart,AppSharingPortCount,AudioPortStart,AudioPortCount,VideoPortStart,VideoPortCount Write-Host \u0026#34;Mediation Server Ports\u0026#34; -ForegroundColor DarkYellow Get-CsService -MediationServer | Format-List Identity,AudioPortStart,AudioPortCount Write-Host \u0026#34;QOS Enabled\u0026#34; -ForegroundColor DarkYellow Get-CsMediaConfiguration -Identity global | Format-List Identity,EnableQoS Write-Host \u0026#34;Edge Server Ports - Best practice to leave default start port 50,000, count 10,000\u0026#34; -ForegroundColor DarkYellow Get-CsService -EdgeServer | Format-List Identity,MediaCommunicationPortStart,MediaCommunicationPortCount Write-Host \u0026#34;Web Server Application Server Ports\u0026#34; -ForegroundColor DarkYellow Get-CsService -Webserver | Format-List Identity,AppSharingPortStart,AppSharingPortCount Write-Host \u0026#34;Lync Phone Edition DSCP Tag\u0026#34; -ForegroundColor DarkYellow Get-CsUCPhoneConfiguration -Identity global | Format-List Identity,VoiceDiffServTag Output below:\nFull output below:\nClient P2P Ports - Ignore ClientSipDynamicPort/Range and ClientMediaPort/Range values Identity : Global ClientMediaPortRangeEnabled : True ClientMediaPort : 5350 ClientMediaPortRange : 40 ClientAudioPort : 50000 ClientAudioPortRange : 20 ClientVideoPort : 55000 ClientVideoPortRange : 20 ClientAppSharingPort : 60000 ClientAppSharingPortRange : 20 ClientFileTransferPort : 65000 ClientFileTransferPortRange : 20 ClientSipDynamicPort : 7100 ClientSipDynamicPortRange : 3 Conferencing Server Ports Identity : ConferencingServer:FEPOOL.DOMAIN AppSharingPortStart : 60000 AppSharingPortCount : 5000 AudioPortStart : 50000 AudioPortCount : 5000 VideoPortStart : 55000 VideoPortCount : 5000 Application Server Ports Identity : ApplicationServer:FEPOOL.DOMAIN AppSharingPortStart : 60000 AppSharingPortCount : 5000 AudioPortStart : 50000 AudioPortCount : 5000 VideoPortStart : 55000 VideoPortCount : 5000 Mediation Server Ports Identity : MediationServer:MEDPOOL.DOMAIN AudioPortStart : 50000 AudioPortCount : 5000 QOS Enabled Identity : Global EnableQoS : True Edge Server Ports - Best practice to leave default start port 50,000, count 10,000 Identity : EdgeServer:EDGPOOL.DOMAIN MediaCommunicationPortStart : 50000 MediaCommunicationPortCount : 10000 Web Server Application Server Ports Identity : WebServer:FEPOOL.DOMAIN AppSharingPortStart : 60000 AppSharingPortCount : 5000 Identity : WebServer:DIRPOOL.DOMAIN AppSharingPortStart : 60000 AppSharingPortCount : 5000 Lync Phone Edition DSCP Tag Identity : Global VoiceDiffServTag : 46 From the above you can see that the port ranges for all modalities are as follows:\nAudio: 50,000 \u0026gt; 54,999 (50,000 \u0026gt; 50,019 P2P) Video: 55,000 \u0026gt; 59,999 (55,000 \u0026gt; 55,019 P2P) App Sharing: 60,000 \u0026gt; 64999 (60,000 \u0026gt; 60,019) P2P File Transfer: 65,000 \u0026gt; 65,019 (P2P) Another nice feature of the QoS calculator is aligning the P2P ports with the Server ports.\n","permalink":"https://chrishayward.co.uk/2016/01/26/skype-for-business-get-qos-configuration-with-powershell/","summary":"\u003cp\u003eWhen configuring QoS (Quality of Service) in Microsoft Lync / Skype for Business you need to modify the media port ranges for various Services and Configuration using PowerShell.\u003c/p\u003e\n\u003cp\u003ePat Richard has made a brilliant QoS calculator for Lync/Skype for Business here \u003ca href=\"http://www.ehloworld.com/2821\"\u003ehttp://www.ehloworld.com/2821\u003c/a\u003e.  The calculator will provide you with the PowerShell commands required to configure QoS port ranges and the GPO\u0026rsquo;s.  The calculator also gives you the commands to verify the Configuration (which this post is based on).\u003c/p\u003e","title":"Skype for Business – Get QoS Configuration with PowerShell"},{"content":"This is a very rough and ready script to install Microsoft SCCM 2012 R2 and SCOM 2012 R2 on a non-domain joined Windows Server 2012 R2 (e.g. DMZ). The script is provided \u0026ldquo;As is\u0026rdquo; so please test it thoroughly on your environment. You will need to modify the script to suit your environment, you will notice there are no variables configured etc.\nOn this environment SCOM and SCCM were both configured to use certificates (HTTPS), this script will generate the CSR and uses the same Certificate for SCOM and SCCM. They both require a Client and Server Authentication Certificate where the Subject Name matches the FQDN of the server. You need to configure your server name and DNS suffix before running this script.\nFirewall Ports required:\nSCCM - TCP/443 and TCP/8531\nSCOM - TCP/5723\nThe script requires a few files to work, here is an example folder structure:\nRootCerts - Contains all of your internal root and intermediate CA\u0026rsquo;s SCCM - Contains SCCM Client Installation SCOM - Contains SCOM Agent Installation SupportTools - Folder from SCOM Install Media (MOMCertImport.exe required) The script works as follows (Again you will need to modify to suit your needs):\nGets FQDN of computer Gets the current directory (So we know where to get the installation media and certs from) Imports root certificates into the local machines root store (root) and intermediate certificates into the local machines intermediate store (CA) Creates Host file entries for SCOM and SCCM servers (assumes no DNS) Generates a certificate request file in C:\\_Temp. (Change template to suit your environment) Opens Notepad for user to copy the CSR and generate Certificate via internal CA\u0026rsquo;s Waits for user to place the new certificate in C:\\_Temp\\ Installs SCCM Client (With your site settings - this example uses HTTPS) Installs SCOM Agent (With your management server settings) Installs SCOM CU, assigns SCOM certificate and restarts SCOM service. Here is the script, again it\u0026rsquo;s very much a draft and suited my customer. Please amend and test thoroughly before running it on your production systems.\n\u0026lt;# Author: Chris Hayward, chrishayward.co.uk Purpose: Script to part automate SCCM client and SCOM agent installs on DMZ and Workgroup machines Version: 1.0 Changes: DATE - Change 22/12/2015 - Release 1.0 Known Errors: Limitations: Compatible with PowerShell 4.0 only (Windows Server 2012 R2) #\u0026gt; Function Pause{ Read-Host \u0026#34;Press any key to continue\u0026#34; } Write-Host \u0026#34;Script to part automate SCCM client and SCOM agent installs on DMZ and Workgroup machines\u0026#34; Write-Host \u0026#34;\u0026#34; Write-Host \u0026#34;Please ensure that the machine name and DNS suffix are correct before proceding\u0026#34; -ForegroundColor Yellow Write-Host \u0026#34;\u0026#34; Write-Host \u0026#34;Ensure Firewall ACLs and routing is in place to allow connectivity to SCOM and SCCM servers \u0026#34; -ForegroundColor Yellow Pause # Get machine name and FQDN $Machine = get-content env:Computername $FQDN = [system.net.dns]::GetHostEntry($Machine).HostName # Get the current directory $scriptpath = $MyInvocation.MyCommand.Path $dir = Split-Path $scriptpath # Import root certificates into correct stores Import-Certificate -FilePath \u0026#34;$dir\\RootCerts\\MyRootCert.p7b\u0026#34; -CertStoreLocation Cert:\\LocalMachine\\Root Import-Certificate -FilePath \u0026#34;$dir\\RootCerts\\MyIntermediateCert.p7b\u0026#34; -CertStoreLocation Cert:\\LocalMachine\\CA # Create HOSTS file entries $hosts = \u0026#34;C:\\windows\\System32\\drivers\\etc\\hosts\u0026#34; add-content $hosts \u0026#34;\u0026#34; add-content $hosts \u0026#34;\u0026#34; add-content $hosts \u0026#34;#Specific entries for SCCM and SCOM\u0026#34; add-content $hosts \u0026#34;10.10.10.101 SCOM-Server.yourdomain.local\u0026#34; add-content $hosts \u0026#34;10.10.10.102 SCCM-Server.yourdomain.local\u0026#34; # Create certificate request\u0026#34; $ReqDir = \u0026#34;c:\\_Temp\\\u0026#34; $ReqFile = \u0026#34;certrequest.inf\u0026#34; $ReqCSR = \u0026#34;BinaryRequest.req\u0026#34; $Cert = \u0026#34;NewCertificate.cer\u0026#34; $ReqFile = $ReqDir + $ReqFile $ReqCSR = $ReqDir + $ReqCSR $Cert = $ReqDir + $Cert New-Item $ReqDir -type directory -force If(Test-Path $ReqFile){ Remove-Item $ReqFile -Force } add-content $ReqFile \u0026#34;[NewRequest]\u0026#34; add-content $ReqFile \u0026#34;Subject=`\u0026#34;CN=$FQDN`\u0026#34;\u0026#34; add-content $ReqFile \u0026#34;KeySpec=1\u0026#34; add-content $ReqFile \u0026#34;KeyUsage=0xf0\u0026#34; add-content $ReqFile \u0026#34;KeyLength=2048\u0026#34; add-content $ReqFile \u0026#34;MachineKeySet=TRUE\u0026#34; add-content $ReqFile \u0026#34;[RequestAttributes]\u0026#34; add-content $ReqFile \u0026#34;CertificateTemplate=`\u0026#34;SCOMTemplate`\u0026#34;\u0026#34; certreq -new -f $ReqFile $ReqCSR # Prompt user to copy certificate cls Write-Host \u0026#34;Please follow instructions\u0026#34; Write-Host \u0026#34;Notepad is about to open, please copy and paste the CSR into the Certificate Enrollment Web Service from a Domain Joined machine\u0026#34; -ForegroundColor Magenta Write-Host \u0026#34;You need to select SCOMTemplate when requesting the certificate\u0026#34; -ForegroundColor Yellow Write-Host \u0026#34;You need to download the certificate in BASE64 format\u0026#34; -ForegroundColor Yellow Pause NOTEPAD.EXE /A $ReqCSR # Prompt user to copy certificate to temp directory cls Write-Host \u0026#34;Please follow instructions\u0026#34; Write-Host \u0026#34;Please copy the certificate to the temp directory c:\\_temp\\ and name it NewCertificate.cer\u0026#34; -ForegroundColor Magenta Pause Function TestCertPath { If(!(Test-Path $cert)){ Write-Warning \u0026#34;Could not find certificate file\u0026#34; Write-Warning \u0026#34;Ensure that you have requested a certificate and saved it in $cert\u0026#34; Pause TestCertPath } } TestCertPath certreq -accept $Cert # Install SCCM 2012 R2 Client (Latest CU will be pushed by SCCM server) cls Write-Host \u0026#34;Installing SCCM Client\u0026#34; .\\SCCM\\ccmsetup.exe /UsePKICert /NoCRLCheck SMSSITECODE=ABC SMSMP=https://SCCM-Server.yourdomain.local Write-Host \u0026#34;Waiting 3 minutes\u0026#34; Start-Sleep 180 # Install SCOM 2012 R2 Client and latest CU Write-Host \u0026#34;Installing SCOM Client\u0026#34; msiexec.exe /i `\u0026#34;$dir\\SCOM\\MOMAgent.msi`\u0026#34; USE_SETTINGS_FROM_AD=0 MANAGEMENT_GROUP=MG01 MANAGEMENT_SERVER_DNS=SCOM-Server.yourdomain.local ACTIONS_USE_COMPUTER_ACCOUNT=1 USE_MANUALLY_SPECIFIED_SETTINGS=1 AcceptEndUserLicenseAgreement=1 /qn Write-Host \u0026#34;Waiting 3 minutes\u0026#34; Start-Sleep 180 Write-Host \u0026#34;Installing SCOM Client CU\u0026#34; msiexec.exe /i `\u0026#34;$dir\\SCOM\\KB2965445-amd64-Agent.msp`\u0026#34; /qn Write-Host \u0026#34;Waiting 3 minutes\u0026#34; Start-Sleep 180 # Run MOMCERTIMPORT Write-Host \u0026#34;Registering Certificate with SCOM\u0026#34; .\\SupportTools\\AMD64\\MOMCertImport.exe /subjectname $FQDN Write-Host \u0026#34;Waiting 30 seconds\u0026#34; Start-Sleep 30 Write-Host \u0026#34;Restarting SCOM Health Service\u0026#34; Restart-Service -Name HealthService Write-Host \u0026#34;Complete!\u0026#34; ","permalink":"https://chrishayward.co.uk/2015/12/22/scom-sccm-script-install-on-dmz-or-workgroup-machine/","summary":"\u003cp\u003eThis is a very rough and ready script to install Microsoft SCCM 2012 R2 and SCOM 2012 R2 on a non-domain joined Windows Server 2012 R2 (e.g. DMZ).  The script is provided \u0026ldquo;As is\u0026rdquo; so please test it thoroughly on your environment.  You will need to modify the script to suit your environment, you will notice there are no variables configured etc.\u003c/p\u003e\n\u003cp\u003eOn this environment SCOM and SCCM were both configured to use certificates (HTTPS), this script will generate the CSR and uses the same Certificate for SCOM and SCCM.  They both require a Client and Server Authentication Certificate where the Subject Name matches the FQDN of the server.  You need to configure your server name and DNS suffix before running this script.\u003c/p\u003e","title":"SCOM / SCCM – Script install on DMZ or Workgroup Machine"},{"content":"I was recently working for a customer where their security policy prohibited traffic from the internet terminating on servers within the LAN.\nSkype for Business (Including previous versions Lync and OCS) uses a Reverse Proxy to terminate web requests within the DMZ and re-write the requests to the Front End Pool(s) within the LAN. The request is received on TCP/443 (HTTPS) and sent to the Front End VIP on TCP/4443. In the case of Standard Edition servers the request would be direct rather than to the Hardware Load Balancer. See diagram below:\nThe customer and their security consultant deemed this as violating their security policy as external traffic from the Internet is ultimately serviced by a server on the LAN (It makes an interesting debate but not discussing it here).\nThe simple URLs (lyncdiscover, meet and dialin) are accessed anonymous where as external traffic to the Front End Pool External Web Services handles authentication and is authenticated thereafter. The Microsoft solution is to deploy a Director Pool to handle anonymous traffic and authentication. However, Director Pools are domain joined and would usually be deployed on the inside of your Firewalls (Datacentre LAN).\nThis would still violate the customers security policy and on top of that each Front End Pool still has it\u0026rsquo;s own External Web Services URL which absolutely must terminate on the Front End pool. There is no method to avoid HTTPS traffic from external users on the Internet not hitting the Front End Web Services (GAL downloads etc).\nThe compromise was to deploy a Director pool within the DMZ to handle all unauthenticated HTTPS requests. In this solution internal LAN users do not use the Director Pool and all internal DNS records point to the Front End pool. This Director pool is purely for external users only.\nAfter digging around on Technet and looking at the Skype for Business Protocol and Workloads poster I came up with a list of ports that would be required for the Director pool to work correctly. Some things were missing (Mainly the Backend SQL and File Store as CMS replication would not work). It\u0026rsquo;s also worth noting that the Director Pool is on the same DMZ network as the Internal Edge so I didn\u0026rsquo;t need rules between Edge Pool and Director Pool. Diagram with ports required below:\n*SQL TCP Port - In my example the SQL Instance had a static port of TCP/2700 set. You should configure the Backend SQL to use a static port and amend appropriately.\nYou can see that the Director Pool is now handling all anonymous HTTPS traffic from the simple URLs and handles authentication.\nWe still need the rule in place for the Front End Web Services but this will be authenticated traffic. You could argue that by having rules from the DMZ into the corporate Active Directory/SQL server and File Server has \u0026ldquo;Bridged\u0026rdquo; security zones and less secure. Ultimately this solution satisfied a security requirement and I hope it helps you if you run into the same problem.\n","permalink":"https://chrishayward.co.uk/2015/12/18/skype-for-business-director-pool-in-dmz-secure-environment/","summary":"\u003cp\u003eI was recently working for a customer where their security policy prohibited traffic from the internet terminating on servers within the LAN.\u003c/p\u003e\n\u003cp\u003eSkype for Business (Including previous versions Lync and OCS) uses a Reverse Proxy to terminate web requests within the DMZ and re-write the requests to the Front End Pool(s) within the LAN.  The request is received on TCP/443 (HTTPS) and sent to the Front End VIP on TCP/4443.  In the case of Standard Edition servers the request would be direct rather than to the Hardware Load Balancer.  See diagram below:\u003c/p\u003e","title":"Skype for Business – Director Pool in DMZ (Secure Environment)"},{"content":"When enabling users for Skype for Business you may encounter the following error:\n\u0026ldquo;Active Directory operation failed on \u0026ldquo;Domain Controller\u0026rdquo;. You cannot retry this operation: \u0026ldquo;Insufficient access rights to perform the operation\u0026rdquo;\nI first blogged about this in 2011 for Microsoft Lync 2010 when moving users from an OCS 2007 R2 to Lync 2010 pool:\n/2011/03/28/lync-2010-move-user-1-errors-failed-while-updating-destination-pool/\nThis problem can occur when:\nEnabling a user Moving a user between pools Changing any of the users Skype for Business properties, including policies You verify that your administrative account is a member of CsAdministrator and you may also be a member of RTCUniversalServerAdmins and Domain Admins.\nThis error occurs when the user you are administering is a member (or has previously been a member) of a protected Active Directory group (e.g. Domain Admins). When a user is a member of a protected AD group, AD automatically removes security inheritance for that user. More about AdminSDHolder and SDProp here.\nIn order to manage the user you need to re-apply security inheritance on the users account.\nOpen Active Directory Users and Computers (ensure you are viewing advanced features “View – Advanced Features”) Open the user account properties for the user you want to move Open the “Security” tab Click the “Advanced” button Check “Allow inheritable permissions from the parent to propagate to this object and all child objects” Click “Apply” You should now be able enable the user for Skype for Business. The AD AdminSDHolder will remove the inheritance from this user again (runs once per hour) so you need to make your changes in Skype for Business fairly quickly.\n","permalink":"https://chrishayward.co.uk/2015/12/17/skype-for-business-2015-enable-user-active-directory-operation-failed/","summary":"\u003cp\u003eWhen enabling users for Skype for Business you may encounter the following error:\u003c/p\u003e\n\u003cp\u003e\u0026ldquo;Active Directory operation failed on \u0026ldquo;Domain Controller\u0026rdquo;.  You cannot retry this operation: \u0026ldquo;Insufficient access rights to perform the operation\u0026rdquo;\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/wp-content/uploads/2015/12/SfB-Enable-Admin-User-Error.jpg\"\u003e\u003cimg alt=\"SfB-Enable-Admin-User-Error\" loading=\"lazy\" src=\"/wp-content/uploads/2015/12/SfB-Enable-Admin-User-Error-300x41.jpg\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eI first blogged about this in 2011 for Microsoft Lync 2010 when moving users from an OCS 2007 R2 to Lync 2010 pool:\u003c/p\u003e\n\u003cp\u003e/2011/03/28/lync-2010-move-user-1-errors-failed-while-updating-destination-pool/\u003c/p\u003e\n\u003cp\u003eThis problem can occur when:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eEnabling a user\u003c/li\u003e\n\u003cli\u003eMoving a user between pools\u003c/li\u003e\n\u003cli\u003eChanging any of the users Skype for Business properties, including policies\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eYou verify that your administrative account is a member of CsAdministrator and you may also be a member of RTCUniversalServerAdmins and Domain Admins.\u003c/p\u003e","title":"Skype for Business 2015 – Enable User \"Active Directory operation failed\""},{"content":"I recently came across an issue where the SCOM (System Center Operations Manager) Agent was installed on all servers in a customers Skype for Business (SfB) Edge pool but they were not appearing in the SfB Management Pack (Skype for Business 2015 Server Health).\nAll Edge servers were showing as \u0026ldquo;Agent Managed\u0026rdquo; in SCOM and appeared in \u0026ldquo;Discovered Inventory\u0026rdquo; as Critical. Using Health Explorer on each Edge server showed the following:\nSummary\nTopology discovery failed.\nCauses\nThis can happen for a few reasons:\n•The watcher node doesn't have the appropriate permissions•Skype for Business Server 2015 Powershell Module is not installed. Resolutions\nFix the permission issues.\nThe context tab showed the following:\nDescription: DiscoverMachine.ps1 : \u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026ndash; -Script Name: Skype for Business Server 2015 MP Machine Topology Discovery -Run as account: nt authority\\network service -Execution Policy: RemoteSigned \u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026ndash; Value of Source Id is {5AAFA97E-833F-9AD1-2678-56AFD1E2214C}. Value of ManagedEntity Id is {C4F6E362-BE95-93C1-729D-3F7BD6FAAFD6}. Value of Target Computer is EDGESERVER01.group.domain.com. SkypeForBusiness Module is added Successfully initialize discovery data. An exception occurred during discovery script, Exception : Could not connect to SQL server : [Exception=System.Data.SqlClient.SqlException (0x80131904): Cannot open database \u0026ldquo;xds\u0026rdquo; requested by the login. The login failed. Login failed for user \u0026lsquo;NT AUTHORITY\\NETWORK SERVICE\u0026rsquo;. at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action1 wrapCloseInAction) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean\u0026amp;amp; dataReady) at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) at System.Data.SqlClient.SqlInternalConnectionTds.CompleteLogin(Boolean enlistOK) at System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean ignoreSniOpenTimeout, TimeoutTimer timeout, Boolean withFailover) at System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString connectionOptions, SqlCredential credential, TimeoutTimer timeout) at System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(TimeoutTimer timeout, SqlConnectionString connectionOptions, SqlCredential credential, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance) at System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString userConnectionOptions, SessionData reconnectSessionData) at System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions) at System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnectionPool pool, DbConnection owningObject, DbConnectionOptions options, DbConnectionPoolKey poolKey, DbConnectionOptions userOptions) at System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection) at System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection) at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal\u0026amp;amp; connection) at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, TaskCompletionSource1 retry, DbConnectionOptions userOptions, DbConnectionInternal\u0026amp; connection) at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal\u0026amp;amp; connection) at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource1 retry, DbConnectionOptions userOptions) at System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource1 retry) at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource1 retry) at System.Data.SqlClient.SqlConnection.Open() at Microsoft.Rtc.Common.Data.DBCore.PerformSprocContextExecution(SprocContext sprocContext) ClientConnectionId:6de6255a-91a3-4d5d-b52c-f819cb1e4a1b Error Number:4060,State:1,Class:11]. \u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026ndash;\nThe fix was to add \u0026ldquo;Network Service\u0026rdquo; to the following local groups on each Edge server:\nRTC Component Local Group RTC Local Administrators After Network Service has been granted the above permissions, restart the Microsoft Monitoring Agent Service.\nWithin a few minutes all Edge servers appeared under the Skype for Business Management Pack.\nThe same problem with Lync 2013 can be found on TechNet here.\n","permalink":"https://chrishayward.co.uk/2015/12/10/skype-for-business-2015-edge-servers-not-discovered-by-scom-sfb-management-pack/","summary":"\u003cp\u003eI recently came across an issue where the SCOM (System Center Operations Manager) Agent was installed on all servers in a customers Skype for Business (SfB) Edge pool but they were not appearing in the SfB Management Pack (Skype for Business 2015 Server Health).\u003c/p\u003e\n\u003cp\u003eAll Edge servers were showing as \u0026ldquo;Agent Managed\u0026rdquo; in SCOM and appeared in \u0026ldquo;Discovered Inventory\u0026rdquo; as Critical.  Using Health Explorer on each Edge server showed the following:\u003c/p\u003e","title":"Skype for Business 2015 – Edge Servers not discovered by SCOM SfB Management Pack"},{"content":"A few years ago I created a Lync 2013 backup script that would backup data from all servers in the Topology. Lync 2013 Automated Backup Script\nThis script also works with Skype for Business 2015 but it specifically backed up Response Group and User data by identifying the pool version. The script below has been updated and tested on SfB 2015.\n\u0026lt;# Author: Chris Hayward, chrishayward.co.uk Purpose: Centralised script to backup Lync 2013 and SfB 2015 Version: 1.2 Changes: DATE - Change 06/11/2013 - Release 1.1 - Fixed code that deletes old backup directories (CH) 27/11/2015 - 1.2 Updated for Skype for Business (version -gt 7 rather than -eq 6) #\u0026gt; Import-Module Lync # Script Config $BackupPath = \u0026#34;D:\\_Backup\\\u0026#34; # Backup Path $BackupRetention = -14 # Number of days to keep old backups (Requires a \u0026#34;-\u0026#34;, e.g. two weeks would be -14, 5 days would be -5) # *** Start of script *** # Delete old backup directories Get-ChildItem $BackupPath |? {$_.psiscontainer -and $_.lastwritetime -le (get-date).adddays($BackupRetention)} |% {remove-item $_.FullName -recurse -force} # Get date in day-month-year format and set backup path $DateStamp = Get-Date -Format dd-MM-yy $BackupPath = $BackupPath + \u0026#34;LyncBackup_\u0026#34; + $DateStamp +\u0026#34;\\\u0026#34; New-Item $BackupPath -type directory -force # Backup the Lync Central Management Store $CMSBackupFile = $BackupPath + \u0026#34;Lync-CMS-Config.zip\u0026#34; Export-CsConfiguration -FileName $CMSBackupFile # Backup Location Information Service data $LISBackupFile = $BackupPath + \u0026#34;Lync-LIS-Config.zip\u0026#34; Export-CsLisConfiguration -FileName $LISBackupFile # Backup User Data (Lync 2013 \u0026amp; SfB 2015 servers only) $UserServer = Get-CsService -UserServer | Where-Object {$_.version -ge 6} ForEach ($Service in $UserServer) { $UserDataBackupFile = $BackupPath + \u0026#34;Lync-User-Config_\u0026#34; + $($Service.PoolFqdn) + \u0026#34;.zip\u0026#34; Export-CsUserData -PoolFQDN $($Service.PoolFqdn) -FileName $UserDataBackupFile } # Backup Response Group Configuration (Lync 2013 \u0026amp; SfB 2015 servers only) $ApplicationServer = Get-CsService -ApplicationServer | Where-Object {$_.version -ge 6} ForEach ($Service in $ApplicationServer) { $RGSBackupFile = $BackupPath + \u0026#34;Lync-RGS-Config_\u0026#34; + $($Service.PoolFqdn) + \u0026#34;.zip\u0026#34; Export-CsRgsConfiguration -Source ApplicationServer:$($Service.PoolFqdn) -FileName $RGSBackupFile } # Backup Voice Configuration $BackupPath = $BackupPath + \u0026#34;Lync-Voice-Config\\\u0026#34; New-Item $BackupPath -type directory -force Get-CsDialPlan | Export-Clixml -path $BackupPath\\DialPlan.xml Get-CsVoicePolicy | Export-Clixml -path $BackupPath\\VoicePolicy.xml Get-CsVoiceRoute | Export-Clixml -path $BackupPath\\VoiceRoute.xml Get-CsPstnUsage | Export-Clixml -path $BackupPath\\PSTNUsage.xml Get-CsVoiceConfiguration | Export-Clixml -path $BackupPath\\VoiceConfiguration.xml Get-CsTrunkConfiguration | Export-Clixml -path $BackupPath\\TrunkConfiguration.xml To run the script as a scheduled task:\nCreate a service account and add it to the RTCUniversalServerAdmins AD group (e.g. svclyncbackup) Copy the above PowerShell script to one of your SfB servers (e.g. Front End 1 C:\\Tasks\\SfB-Backup.ps1) Create a scheduled task to run daily (e.g. 3am) Create an Action \u0026gt; Start a Program \u0026gt; Program=powershell.exe \u0026gt; Arguments=C:\\Tasks\\SfB-Backup.ps1 ","permalink":"https://chrishayward.co.uk/2015/11/27/skype-for-business-2015-automated-backup-script/","summary":"\u003cp\u003eA few years ago I created a Lync 2013 backup script that would backup data from all servers in the Topology. \u003ca href=\"/2013/07/07/lync-2013-automated-backup-script/\"\u003eLync 2013 Automated Backup Script\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eThis script also works with Skype for Business 2015 but it specifically backed up Response Group and User data by identifying the pool version.  The script below has been updated and tested on SfB 2015.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-powershell\" data-lang=\"powershell\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e\u0026lt;#\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003eAuthor:  Chris Hayward, chrishayward.co.uk\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003ePurpose: Centralised script to backup Lync 2013 and SfB 2015\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003eVersion: 1.2\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003eChanges: DATE - Change\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e        06/11/2013 - Release 1.1 - Fixed code that deletes old backup directories (CH)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e        27/11/2015 - 1.2 Updated for Skype for Business (version -gt 7 rather than -eq 6)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e#\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eImport-Module\u003c/span\u003e \u003cspan class=\"n\"\u003eLync\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Script Config\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$BackupPath\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;D:\\_Backup\\\u0026#34;\u003c/span\u003e \u003cspan class=\"c\"\u003e# Backup Path\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$BackupRetention\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mf\"\u003e-14\u003c/span\u003e \u003cspan class=\"c\"\u003e# Number of days to keep old backups (Requires a \u0026#34;-\u0026#34;, e.g. two weeks would be -14, 5 days would be -5)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# *** Start of script ***\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Delete old backup directories\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eGet-ChildItem\u003c/span\u003e \u003cspan class=\"nv\"\u003e$BackupPath\u003c/span\u003e \u003cspan class=\"p\"\u003e|?\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"nv\"\u003e$_\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"py\"\u003epsiscontainer\u003c/span\u003e \u003cspan class=\"o\"\u003e-and\u003c/span\u003e \u003cspan class=\"nv\"\u003e$_\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"py\"\u003elastwritetime\u003c/span\u003e \u003cspan class=\"o\"\u003e-le\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nb\"\u003eget-date\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"py\"\u003eadddays\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003e$BackupRetention\u003c/span\u003e\u003cspan class=\"p\"\u003e)}\u003c/span\u003e \u003cspan class=\"p\"\u003e|%\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"nb\"\u003eremove-item\u003c/span\u003e \u003cspan class=\"nv\"\u003e$_\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"py\"\u003eFullName\u003c/span\u003e \u003cspan class=\"n\"\u003e-recurse\u003c/span\u003e \u003cspan class=\"n\"\u003e-force\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Get date in day-month-year format and set backup path\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$DateStamp\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"nb\"\u003eGet-Date\u003c/span\u003e \u003cspan class=\"n\"\u003e-Format\u003c/span\u003e \u003cspan class=\"nb\"\u003edd-MM\u003c/span\u003e\u003cspan class=\"n\"\u003e-yy\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$BackupPath\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"nv\"\u003e$BackupPath\u003c/span\u003e \u003cspan class=\"p\"\u003e+\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;LyncBackup_\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e+\u003c/span\u003e \u003cspan class=\"nv\"\u003e$DateStamp\u003c/span\u003e \u003cspan class=\"p\"\u003e+\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\\\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eNew-Item\u003c/span\u003e \u003cspan class=\"nv\"\u003e$BackupPath\u003c/span\u003e \u003cspan class=\"n\"\u003e-type\u003c/span\u003e \u003cspan class=\"n\"\u003edirectory\u003c/span\u003e \u003cspan class=\"n\"\u003e-force\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Backup the Lync Central Management Store\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$CMSBackupFile\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"nv\"\u003e$BackupPath\u003c/span\u003e \u003cspan class=\"p\"\u003e+\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Lync-CMS-Config.zip\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eExport-CsConfiguration\u003c/span\u003e \u003cspan class=\"n\"\u003e-FileName\u003c/span\u003e \u003cspan class=\"nv\"\u003e$CMSBackupFile\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Backup Location Information Service data\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$LISBackupFile\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"nv\"\u003e$BackupPath\u003c/span\u003e \u003cspan class=\"p\"\u003e+\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Lync-LIS-Config.zip\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eExport-CsLisConfiguration\u003c/span\u003e \u003cspan class=\"n\"\u003e-FileName\u003c/span\u003e \u003cspan class=\"nv\"\u003e$LISBackupFile\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Backup User Data (Lync 2013 \u0026amp; SfB 2015 servers only)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$UserServer\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"nb\"\u003eGet-CsService\u003c/span\u003e \u003cspan class=\"n\"\u003e-UserServer\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"nb\"\u003eWhere-Object\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"nv\"\u003e$_\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"py\"\u003eversion\u003c/span\u003e \u003cspan class=\"o\"\u003e-ge\u003c/span\u003e \u003cspan class=\"mf\"\u003e6\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eForEach\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003e$Service\u003c/span\u003e \u003cspan class=\"k\"\u003ein\u003c/span\u003e \u003cspan class=\"nv\"\u003e$UserServer\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nv\"\u003e$UserDataBackupFile\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"nv\"\u003e$BackupPath\u003c/span\u003e \u003cspan class=\"p\"\u003e+\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Lync-User-Config_\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e+\u003c/span\u003e \u003cspan class=\"vm\"\u003e$\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003e$Service\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePoolFqdn\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e+\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;.zip\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eExport-CsUserData\u003c/span\u003e \u003cspan class=\"n\"\u003e-PoolFQDN\u003c/span\u003e \u003cspan class=\"vm\"\u003e$\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003e$Service\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePoolFqdn\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003e-FileName\u003c/span\u003e \u003cspan class=\"nv\"\u003e$UserDataBackupFile\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Backup Response Group Configuration (Lync 2013 \u0026amp; SfB 2015 servers only)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$ApplicationServer\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"nb\"\u003eGet-CsService\u003c/span\u003e \u003cspan class=\"n\"\u003e-ApplicationServer\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"nb\"\u003eWhere-Object\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"nv\"\u003e$_\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"py\"\u003eversion\u003c/span\u003e \u003cspan class=\"o\"\u003e-ge\u003c/span\u003e \u003cspan class=\"mf\"\u003e6\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eForEach\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003e$Service\u003c/span\u003e \u003cspan class=\"k\"\u003ein\u003c/span\u003e \u003cspan class=\"nv\"\u003e$ApplicationServer\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nv\"\u003e$RGSBackupFile\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"nv\"\u003e$BackupPath\u003c/span\u003e \u003cspan class=\"p\"\u003e+\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Lync-RGS-Config_\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e+\u003c/span\u003e \u003cspan class=\"vm\"\u003e$\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003e$Service\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePoolFqdn\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e+\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;.zip\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eExport-CsRgsConfiguration\u003c/span\u003e \u003cspan class=\"n\"\u003e-Source\u003c/span\u003e \u003cspan class=\"n\"\u003eApplicationServer\u003c/span\u003e\u003cspan class=\"err\"\u003e:\u003c/span\u003e\u003cspan class=\"vm\"\u003e$\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003e$Service\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePoolFqdn\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003e-FileName\u003c/span\u003e \u003cspan class=\"nv\"\u003e$RGSBackupFile\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Backup Voice Configuration\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$BackupPath\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"nv\"\u003e$BackupPath\u003c/span\u003e \u003cspan class=\"p\"\u003e+\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Lync-Voice-Config\\\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eNew-Item\u003c/span\u003e \u003cspan class=\"nv\"\u003e$BackupPath\u003c/span\u003e \u003cspan class=\"n\"\u003e-type\u003c/span\u003e \u003cspan class=\"n\"\u003edirectory\u003c/span\u003e \u003cspan class=\"n\"\u003e-force\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eGet-CsDialPlan\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"nb\"\u003eExport-Clixml\u003c/span\u003e \u003cspan class=\"n\"\u003e-path\u003c/span\u003e \u003cspan class=\"nv\"\u003e$BackupPath\u003c/span\u003e\u003cspan class=\"p\"\u003e\\\u003c/span\u003e\u003cspan class=\"n\"\u003eDialPlan\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"py\"\u003exml\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eGet-CsVoicePolicy\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"nb\"\u003eExport-Clixml\u003c/span\u003e \u003cspan class=\"n\"\u003e-path\u003c/span\u003e \u003cspan class=\"nv\"\u003e$BackupPath\u003c/span\u003e\u003cspan class=\"p\"\u003e\\\u003c/span\u003e\u003cspan class=\"n\"\u003eVoicePolicy\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"py\"\u003exml\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eGet-CsVoiceRoute\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"nb\"\u003eExport-Clixml\u003c/span\u003e \u003cspan class=\"n\"\u003e-path\u003c/span\u003e \u003cspan class=\"nv\"\u003e$BackupPath\u003c/span\u003e\u003cspan class=\"p\"\u003e\\\u003c/span\u003e\u003cspan class=\"n\"\u003eVoiceRoute\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"py\"\u003exml\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eGet-CsPstnUsage\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"nb\"\u003eExport-Clixml\u003c/span\u003e \u003cspan class=\"n\"\u003e-path\u003c/span\u003e \u003cspan class=\"nv\"\u003e$BackupPath\u003c/span\u003e\u003cspan class=\"p\"\u003e\\\u003c/span\u003e\u003cspan class=\"n\"\u003ePSTNUsage\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"py\"\u003exml\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eGet-CsVoiceConfiguration\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"nb\"\u003eExport-Clixml\u003c/span\u003e \u003cspan class=\"n\"\u003e-path\u003c/span\u003e \u003cspan class=\"nv\"\u003e$BackupPath\u003c/span\u003e\u003cspan class=\"p\"\u003e\\\u003c/span\u003e\u003cspan class=\"n\"\u003eVoiceConfiguration\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"py\"\u003exml\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eGet-CsTrunkConfiguration\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"nb\"\u003eExport-Clixml\u003c/span\u003e \u003cspan class=\"n\"\u003e-path\u003c/span\u003e \u003cspan class=\"nv\"\u003e$BackupPath\u003c/span\u003e\u003cspan class=\"p\"\u003e\\\u003c/span\u003e\u003cspan class=\"n\"\u003eTrunkConfiguration\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"py\"\u003exml\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eTo run the script as a scheduled task:\u003c/p\u003e","title":"Skype for Business  2015 – Automated Backup Script"},{"content":"I recently ran an \u0026ldquo;In-Place\u0026rdquo; upgrade from Lync 2013 to Skype for Business 2015 on a 3 node Enterprise Front End pool. After the upgrade all 3 Front Ends were logging the following error every 10-15 minutes.\nLog Name: Lync Server Source: LS Data Collection Date: 20/11/2015 16:40:38 Event ID: 56407 Task Category: (2271) Level: Error Keywords: Classic User: N/A Computer: LYNCFE00V.domain.local Description: Failed to execute a stored procedure on the back-end. Component: QoE Adaptor Stored Procedure: QoeInsertSessionReport2 Error: System.Data.SqlClient.SqlException (0x80131904): Trying to pass a table-valued parameter with 109 column(s) where the corresponding user-defined table type requires 101 column(s). at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean\u0026amp; dataReady) at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task\u0026amp; task, Boolean asyncWrite, SqlDataReader ds) at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task\u0026amp; task, Boolean asyncWrite) at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite) at System.Data.SqlClient.SqlCommand.ExecuteNonQuery() at Microsoft.Rtc.Common.Data.DBCore.Execute(SprocContext sprocContext, SqlConnection sqlConnection, SqlTransaction sqlTransaction) ClientConnectionId:35301abd-a45b-4593-a2e4-5faf4257097d Error Number:500,State:1,Class:16 Cause: Configuration issues, an unreachable back-end or an unexpected condition has resulted in the error. Resolution: Verify the back-end is up and this Skype for Business Server has connectivity to it. If the problem persists, notify your organization\u0026#39;s support team with the relevant details. Event Xml: \u0026lt;Event xmlns=\u0026#34;http://schemas.microsoft.com/win/2004/08/events/event\u0026#34;\u0026gt; \u0026lt;System\u0026gt; \u0026lt;Provider Name=\u0026#34;LS Data Collection\u0026#34; /\u0026gt; \u0026lt;EventID Qualifiers=\u0026#34;51423\u0026#34;\u0026gt;56407\u0026lt;/EventID\u0026gt; \u0026lt;Level\u0026gt;2\u0026lt;/Level\u0026gt; \u0026lt;Task\u0026gt;2271\u0026lt;/Task\u0026gt; \u0026lt;Keywords\u0026gt;0x80000000000000\u0026lt;/Keywords\u0026gt; \u0026lt;TimeCreated SystemTime=\u0026#34;2015-11-20T16:40:38.000000000Z\u0026#34; /\u0026gt; \u0026lt;EventRecordID\u0026gt;49880\u0026lt;/EventRecordID\u0026gt; \u0026lt;Channel\u0026gt;Lync Server\u0026lt;/Channel\u0026gt; \u0026lt;Computer\u0026gt;LYNCFE00V.domain.local\u0026lt;/Computer\u0026gt; \u0026lt;Security /\u0026gt; \u0026lt;/System\u0026gt; \u0026lt;EventData\u0026gt; \u0026lt;Data\u0026gt;QoE Adaptor\u0026lt;/Data\u0026gt; \u0026lt;Data\u0026gt;QoeInsertSessionReport2\u0026lt;/Data\u0026gt; \u0026lt;Data\u0026gt;System.Data.SqlClient.SqlException (0x80131904): Trying to pass a table-valued parameter with 109 column(s) where the corresponding user-defined table type requires 101 column(s). at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean\u0026amp;amp; dataReady) at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task\u0026amp;amp; task, Boolean asyncWrite, SqlDataReader ds) at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task\u0026amp;amp; task, Boolean asyncWrite) at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite) at System.Data.SqlClient.SqlCommand.ExecuteNonQuery() at Microsoft.Rtc.Common.Data.DBCore.Execute(SprocContext sprocContext, SqlConnection sqlConnection, SqlTransaction sqlTransaction) ClientConnectionId:35301abd-a45b-4593-a2e4-5faf4257097d Error Number:500,State:1,Class:16\u0026lt;/Data\u0026gt; \u0026lt;/EventData\u0026gt; \u0026lt;/Event\u0026gt; I gathered something was wrong with the QOEMetrics database due to \u0026ldquo;Component QOE Adaptor\u0026rdquo;. I ran the following PowerShell command to test the databases on my SQL Backend:\nTest-CsDatabase -ConfiguredDatabases –SqlServerFqdn SQL03.domain.local | Out-GridView (Where -SqlServerFqdn matches your Backend SQL server.)\nYou can see immediately that the QOEMetrics InstalledVersion is a point release lower than the ExpectedVersion. To resolve this I ran the following PowerShell command:\nInstall-CsDatabase -DatabaseType Monitoring -SqlServerFqdn SQL03.domain.local -SqlInstanceName LyncBackend (Where -SqlServerFqdn \u0026amp; -SqlInstanceName matches your Backend SQL server.) Note, I only specified Monitoring for -DatabaseType.\nI then ran Test-CsDatabase again:\nTest-CsDatabase -ConfiguredDatabases –SqlServerFqdn SQL03.domain.local | Out-GridView You can see that the ExpectedVersion and InstalledVersion now match. This resolved this problem and the Event ID is no longer generated on the Front End Servers.\n","permalink":"https://chrishayward.co.uk/2015/11/20/skype-for-business-failed-to-execute-a-stored-procedure-on-the-back-end/","summary":"\u003cp\u003eI recently ran an \u0026ldquo;In-Place\u0026rdquo; upgrade from Lync 2013 to Skype for Business 2015 on a 3 node Enterprise Front End pool.  After the upgrade all 3 Front Ends were logging the following error every 10-15 minutes.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eLog Name:      Lync Server\nSource:        LS Data Collection\nDate:          20/11/2015 16:40:38\nEvent ID:      56407\nTask Category: (2271)\nLevel:         Error\nKeywords:      Classic\nUser:          N/A\nComputer:      LYNCFE00V.domain.local\nDescription:\nFailed to execute a stored procedure on the back-end.\n\nComponent: QoE Adaptor \nStored Procedure: QoeInsertSessionReport2 \nError: System.Data.SqlClient.SqlException (0x80131904): Trying to pass a table-valued parameter with 109 column(s) where the corresponding user-defined table type requires 101 column(s).\n   at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)\n   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)\n   at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean\u0026amp; dataReady)\n   at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)\n   at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task\u0026amp; task, Boolean asyncWrite, SqlDataReader ds)\n   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task\u0026amp; task, Boolean asyncWrite)\n   at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite)\n   at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()\n   at Microsoft.Rtc.Common.Data.DBCore.Execute(SprocContext sprocContext, SqlConnection sqlConnection, SqlTransaction sqlTransaction)\nClientConnectionId:35301abd-a45b-4593-a2e4-5faf4257097d\nError Number:500,State:1,Class:16\nCause: Configuration issues, an unreachable back-end or an unexpected condition has resulted in the error.\nResolution:\nVerify the back-end is up and this Skype for Business Server has connectivity to it. If the problem persists, notify your organization\u0026#39;s support team with the relevant details.\nEvent Xml:\n\u0026lt;Event xmlns=\u0026#34;http://schemas.microsoft.com/win/2004/08/events/event\u0026#34;\u0026gt;\n  \u0026lt;System\u0026gt;\n    \u0026lt;Provider Name=\u0026#34;LS Data Collection\u0026#34; /\u0026gt;\n    \u0026lt;EventID Qualifiers=\u0026#34;51423\u0026#34;\u0026gt;56407\u0026lt;/EventID\u0026gt;\n    \u0026lt;Level\u0026gt;2\u0026lt;/Level\u0026gt;\n    \u0026lt;Task\u0026gt;2271\u0026lt;/Task\u0026gt;\n    \u0026lt;Keywords\u0026gt;0x80000000000000\u0026lt;/Keywords\u0026gt;\n    \u0026lt;TimeCreated SystemTime=\u0026#34;2015-11-20T16:40:38.000000000Z\u0026#34; /\u0026gt;\n    \u0026lt;EventRecordID\u0026gt;49880\u0026lt;/EventRecordID\u0026gt;\n    \u0026lt;Channel\u0026gt;Lync Server\u0026lt;/Channel\u0026gt;\n    \u0026lt;Computer\u0026gt;LYNCFE00V.domain.local\u0026lt;/Computer\u0026gt;\n    \u0026lt;Security /\u0026gt;\n  \u0026lt;/System\u0026gt;\n  \u0026lt;EventData\u0026gt;\n    \u0026lt;Data\u0026gt;QoE Adaptor\u0026lt;/Data\u0026gt;\n    \u0026lt;Data\u0026gt;QoeInsertSessionReport2\u0026lt;/Data\u0026gt;\n    \u0026lt;Data\u0026gt;System.Data.SqlClient.SqlException (0x80131904): Trying to pass a table-valued parameter with 109 column(s) where the corresponding user-defined table type requires 101 column(s).\n   at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)\n   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)\n   at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean\u0026amp;amp; dataReady)\n   at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)\n   at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task\u0026amp;amp; task, Boolean asyncWrite, SqlDataReader ds)\n   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task\u0026amp;amp; task, Boolean asyncWrite)\n   at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite)\n   at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()\n   at Microsoft.Rtc.Common.Data.DBCore.Execute(SprocContext sprocContext, SqlConnection sqlConnection, SqlTransaction sqlTransaction)\nClientConnectionId:35301abd-a45b-4593-a2e4-5faf4257097d\nError Number:500,State:1,Class:16\u0026lt;/Data\u0026gt;\n  \u0026lt;/EventData\u0026gt;\n\u0026lt;/Event\u0026gt;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eI gathered something was wrong with the QOEMetrics database due to \u0026ldquo;Component QOE Adaptor\u0026rdquo;.  I ran the following PowerShell command to test the databases on my SQL Backend:\u003c/p\u003e","title":"Skype for Business – Failed to execute a stored procedure on the back-end"},{"content":"Here is an example Hyper-V replica email notification script.\nScenario is Hyper-V cluster replicating business critical VMs to a single Hyper-V host. The script can be ran as a scheduled task on the DR Hyper-V host to send email notifications. The account running the script must have Hyper-V permissions.\nScript:\nHyper-V 2012 Replica Email Script\n# Created by Chris Hayward # Purpose - To send a daily email displaying Hyper-V Replica status # Version 1.0 # Get date in UK format day/month/year $date = Get-Date -Format dd/MM/yy # Variables $MailFrom = \u0026#39;hyperv_replica@yourdomain.com\u0026#39; $MailTo = \u0026#39;you@yourdomain.com\u0026#39; $MailSubject = \u0026#34;Hyper-V Replica Report $date\u0026#34; $MailServer = \u0026#39;smtp.yourdomain.coml\u0026#39; # Get replication status in HTML format $status = Get-VMReplication | Select-Object Name, State, Health, Mode, FrequencySec, PrimaryServer, ReplicaServer, ReplicaPort | ConvertTo-Html # Send email message Send-MailMessage -From $MailFrom -To $MailTo -Subject $MailSubject -BodyAsHtml -Body \u0026#34;$status\u0026#34; -SmtpServer $MailServer Example output:\nName\nState\nHealth\nMode\nFrequencySec\nPrimaryServer\nReplicaServer\nReplicaPort\nVM01\nReplicating\nNormal\nReplica\n300\nHV-HOST01.domain.local\nHV-DR01.domain.local\n80\nVM02\nReplicating\nNormal\nReplica\n300\nHV-HOST01.domain.local\nHV-DR01.domain.local\n80\nVM03\nReplicating\nCritical\nReplica\n300\nHV-HOST02.domain.local\nHV-DR01.domain.local\n80\nVM04\nReplicating\nNormal\nReplica\n300\nHV-HOST02.domain.local\nHV-DR01.domain.local\n80\nVM05\nReplicating\nNormal\nReplica\n300\nHV-HOST03.domain.local\nHV-DR01.domain.local\n80\n","permalink":"https://chrishayward.co.uk/2015/11/17/hyper-v-2012-r2-hyper-v-replica-email-script/","summary":"\u003cp\u003eHere is an example Hyper-V replica email notification script.\u003c/p\u003e\n\u003cp\u003eScenario is Hyper-V cluster replicating business critical VMs to a single Hyper-V host.  The script can be ran as a scheduled task on the DR Hyper-V host to send email notifications.  The account running the script must have Hyper-V permissions.\u003c/p\u003e\n\u003cp\u003eScript:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eHyper-V 2012 Replica Email Script\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-powershell\" data-lang=\"powershell\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Created by Chris Hayward\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Purpose - To send a daily email displaying Hyper-V Replica status\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Version 1.0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Get date in UK format day/month/year\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$date\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"nb\"\u003eGet-Date\u003c/span\u003e \u003cspan class=\"n\"\u003e-Format\u003c/span\u003e \u003cspan class=\"n\"\u003edd\u003c/span\u003e\u003cspan class=\"p\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eMM\u003c/span\u003e\u003cspan class=\"p\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eyy\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Variables\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$MailFrom\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;hyperv_replica@yourdomain.com\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$MailTo\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;you@yourdomain.com\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$MailSubject\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Hyper-V Replica Report \u003c/span\u003e\u003cspan class=\"nv\"\u003e$date\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$MailServer\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;smtp.yourdomain.coml\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Get replication status in HTML format\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$status\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"nb\"\u003eGet-VMReplication\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"nb\"\u003eSelect-Object\u003c/span\u003e \u003cspan class=\"n\"\u003eName\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eState\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eHealth\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eMode\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eFrequencySec\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ePrimaryServer\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eReplicaServer\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eReplicaPort\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"nb\"\u003eConvertTo-Html\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Send email message\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eSend-MailMessage\u003c/span\u003e \u003cspan class=\"n\"\u003e-From\u003c/span\u003e \u003cspan class=\"nv\"\u003e$MailFrom\u003c/span\u003e \u003cspan class=\"n\"\u003e-To\u003c/span\u003e \u003cspan class=\"nv\"\u003e$MailTo\u003c/span\u003e \u003cspan class=\"n\"\u003e-Subject\u003c/span\u003e \u003cspan class=\"nv\"\u003e$MailSubject\u003c/span\u003e \u003cspan class=\"n\"\u003e-BodyAsHtml\u003c/span\u003e \u003cspan class=\"n\"\u003e-Body\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$status\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003e-SmtpServer\u003c/span\u003e \u003cspan class=\"nv\"\u003e$MailServer\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eExample output:\u003c/p\u003e","title":"Hyper-V 2012 R2- Replica Email Notification Script"},{"content":"I recently deployed Skype for Business 2015 standard edition pool pairing. The CMS was originally on a Lync 2010 Standard edition server and was moved over to a Skype4B Pool1 when Lync was decommissioned.\nSkype4B Pool2 (FE2) was logging the following event IDs every few minutes:\nError1\nEvent ID 4082, LS Backup Service Skype for Business Server 2015, Backup Service central management backup module failed to complete import operation. Configurations: Backup Module Identity:CentralMgmt.CMSMaster Working Directory path:\\\\FRONTEND.domain\\SfBFileShare$\\3-BackupService-2\\BackupStore\\Temp Local File Store Unc path:\\\\FRONTEND.domain\\SfBFileShare$\\3-BackupService-2\\BackupStore Remote File Store Unc path:\\\\FRONTEND.domain\\SfBFileShare$\\2-BackupService-3\\BackupStore Additional Message: Exception: Microsoft.Rtc.BackupService.ImportOperationException: Import operation (from zip archive \\\\FRONTEND.domain\\SfBFileShare$\\3-BackupService-2\\BackupStore\\CentralMgmt\\CMSMaster\\Data\\Backup.zip) is failed due to: Failed to execute stored procedure XdsUpdateReplicaData. Native Error: 2000, Exception: Database layer is not in acquired state. Retriable: False. Cookie: \u0026lt;repl:Status xmlns:repl=\u0026#34;urn:schema:Microsoft.Rtc.Management.Xds.ReplLayer.2008\u0026#34;\u0026gt;\u0026lt;repl:Batch xmlns:repl=\u0026#34;urn:schema:Microsoft.Rtc.Management.Xds.ReplLayer.2008\u0026#34; Id=\u0026#34;2cb13a5a-81ad-47f0-9162-5de8af04d85b\u0026#34; FullVersion=\u0026#34;1\u0026#34; PartialVersion=\u0026#34;248\u0026#34; /\u0026gt;\u0026lt;repl:Batch xmlns:repl=\u0026#34;urn:schema:Microsoft.Rtc.Management.Xds.ReplLayer.2008\u0026#34; Id=\u0026#34;b6a684fe-9989-4659-bffa-9f15eb07a7df\u0026#34; FullVersion=\u0026#34;1\u0026#34; PartialVersion=\u0026#34;6\u0026#34; /\u0026gt;\u0026lt;/repl:Status\u0026gt;. ---\u0026gt; Microsoft.Rtc.Common.Data.SqlConnectionException: Database layer is not in acquired state --- End of inner exception stack trace --- at Microsoft.Rtc.BackupService.BackupModules.XdsBackupModuleBase.UpdateBackupClusterInSingleTransaction(Unzipper unzipper, String newCookie) at Microsoft.Rtc.BackupService.BackupModules.CentralMgmtBackupModule.ApplyChanges(Unzipper unzipper, String\u0026amp; newCookie, Boolean\u0026amp; forceSetErrorState) at Microsoft.Rtc.BackupService.BackupModuleHandler.ReceiveBackupDataTask.ApplyChanges(Boolean\u0026amp; forceSetErrorState) at Microsoft.Rtc.BackupService.BackupModuleHandler.ReceiveBackupDataTask.InternalExecute() at Microsoft.Rtc.Common.TaskManager`1.ExecuteTask(Object state) Cause: Either network or permission issues. Please look through the exception details for more information. Resolution: Resolution Error2\nEvent 4097, LS Backup Service Skype for Business Server 2015, Backup Service central management backup module failed to register with back-end database. The module will continuously attempt to reconnect to the back-end. While this condition persists, no backup will be done. The Connection string: Data Source=(local)\\rtc;Initial Catalog=xds;Integrated Security=True;Enlist=False;Pooling=True;Max Pool Size=3;Connect Timeout=60;Application Name=Microsoft.Rtc.Management.Core Exception: [2000] Cannot open database \u0026#34;xds\u0026#34; requested by the login. The login failed. Login failed for user \u0026#39;NT AUTHORITY\\NETWORK SERVICE\u0026#39;. Cause: Possible issues with central management backup module back-end database. Resolution: Ensure central management backup module back-end is functioning correctly. I found the following post TechNet but Windows Firewall was disabled for Domain Networks on the customers environment.\nI downloaded SQL 2014 Management Studio (MgmtStudio 64BIT\\SQLManagementStudio_x64_ENU.exe) from Microsoft Download. I then connected to the RTC (FRONTEND\\RTC) Instance on both Front End servers and opened the security on the XDS (Central Management Store) database:\nFront End 2:\nFront End 1: It was immediately apparent that FE2 had different security to FE1. To resolve on FE2:\nAdded \u0026ldquo;FRONTEND\\RTC Local Config Replicator\u0026rdquo; as a SQL Login under Security Granted the following groups the correct role on the XDS Database: FRONTEND\\RTC Local Administrators - Publisher Role FRONTEND\\RTC Local Config Replicator - Replicator Role FRONTEND\\RTC Local Read-only Administrators - Consumer Role For good measure I restarted the Skype4B services on FE2 (Stop-CsWindowsService / Start-CsWindowsService)\nThe event logs are now clean on FE2.\n","permalink":"https://chrishayward.co.uk/2015/09/18/skype-for-business-central-management-backup-module-failed/","summary":"\u003cp\u003eI recently deployed Skype for Business 2015 standard edition pool pairing.  The CMS was originally on a Lync 2010 Standard edition server and was moved over to a Skype4B Pool1 when Lync was decommissioned.\u003c/p\u003e\n\u003cp\u003eSkype4B Pool2 (FE2) was logging the following event IDs every few minutes:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eError1\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eEvent ID 4082, LS Backup Service\nSkype for Business Server 2015, Backup Service central management backup module failed to complete import operation.\n\nConfigurations: \nBackup Module Identity:CentralMgmt.CMSMaster\nWorking Directory path:\\\\FRONTEND.domain\\SfBFileShare$\\3-BackupService-2\\BackupStore\\Temp\nLocal File Store Unc path:\\\\FRONTEND.domain\\SfBFileShare$\\3-BackupService-2\\BackupStore\nRemote File Store Unc path:\\\\FRONTEND.domain\\SfBFileShare$\\2-BackupService-3\\BackupStore\n\n Additional Message: \n Exception: Microsoft.Rtc.BackupService.ImportOperationException: Import operation (from zip archive \\\\FRONTEND.domain\\SfBFileShare$\\3-BackupService-2\\BackupStore\\CentralMgmt\\CMSMaster\\Data\\Backup.zip) is failed due to: Failed to execute stored procedure XdsUpdateReplicaData. Native Error: 2000, Exception: Database layer is not in acquired state. Retriable: False. Cookie: \u0026lt;repl:Status xmlns:repl=\u0026#34;urn:schema:Microsoft.Rtc.Management.Xds.ReplLayer.2008\u0026#34;\u0026gt;\u0026lt;repl:Batch xmlns:repl=\u0026#34;urn:schema:Microsoft.Rtc.Management.Xds.ReplLayer.2008\u0026#34; Id=\u0026#34;2cb13a5a-81ad-47f0-9162-5de8af04d85b\u0026#34; FullVersion=\u0026#34;1\u0026#34; PartialVersion=\u0026#34;248\u0026#34; /\u0026gt;\u0026lt;repl:Batch xmlns:repl=\u0026#34;urn:schema:Microsoft.Rtc.Management.Xds.ReplLayer.2008\u0026#34; Id=\u0026#34;b6a684fe-9989-4659-bffa-9f15eb07a7df\u0026#34; FullVersion=\u0026#34;1\u0026#34; PartialVersion=\u0026#34;6\u0026#34; /\u0026gt;\u0026lt;/repl:Status\u0026gt;. ---\u0026gt; Microsoft.Rtc.Common.Data.SqlConnectionException: Database layer is not in acquired state\n   --- End of inner exception stack trace ---\n   at Microsoft.Rtc.BackupService.BackupModules.XdsBackupModuleBase.UpdateBackupClusterInSingleTransaction(Unzipper unzipper, String newCookie)\n   at Microsoft.Rtc.BackupService.BackupModules.CentralMgmtBackupModule.ApplyChanges(Unzipper unzipper, String\u0026amp; newCookie, Boolean\u0026amp; forceSetErrorState)\n   at Microsoft.Rtc.BackupService.BackupModuleHandler.ReceiveBackupDataTask.ApplyChanges(Boolean\u0026amp; forceSetErrorState)\n   at Microsoft.Rtc.BackupService.BackupModuleHandler.ReceiveBackupDataTask.InternalExecute()\n   at Microsoft.Rtc.Common.TaskManager`1.ExecuteTask(Object state)\n\nCause: Either network or permission issues. Please look through the exception details for more information.\nResolution:\nResolution\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eError2\u003c/strong\u003e\u003c/p\u003e","title":"Skype for Business – Central Management Backup Module Failed"},{"content":"Ok here is a little tip when trying to add trusted root certificate authorities to Skype for Business 2015 and Lync 2010/2013 Edge servers.\nMicrosoft have a list of Unified Communications Certificate Providers detailed here: https://support.microsoft.com/en-us/kb/929395\nWindows now automatically downloads Trusted Root certificates when you access a web page on HTTPS. We can exploit this to get all Trusted Root certificates on our Edge servers which is required for Federation to work correctly. An example of this is where you only get one way IM or a federated partner may see your presence as unknown.\nFirst of all you need to allow HTTPS (TCP/443) out from your Edge server(s). If you don\u0026rsquo;t want to bug the Firewall admin you can stop SfB/Lync Services (Stop-CsWindowsService) and remove the Access and Webconf IP addresses from the external NIC. The AV Edge IP should already have TCP/443 outbound.\nNext you need to open up Internet Explorer and navigate to the HTTPS site of each Certificate Provider in the list provided by Microsoft, e.g.:\nhttps://comodo.com\nhttps://digicert.com\nhttps://www.entrust.net\nhttps://geotrust.com\nhttps://www.globalsign.com\nhttps://godaddy.com\nhttps://symantec.com\nhttps://thawte.com\nhttps://wisekey.com\nOnce complete you will see that Trusted Root Certification Authorities is now populated:\nIf you have removed your Access and Webconf IPs from the external NIC, re-add them and start the SfB/Lync services (Start-CsWindowsService)\n","permalink":"https://chrishayward.co.uk/2015/09/17/skype-for-business-lync-easiest-way-to-add-trusted-root-certificate-authorities-to-edge/","summary":"\u003cp\u003eOk here is a little tip when trying to add trusted root certificate authorities to Skype for Business 2015 and Lync 2010/2013 Edge servers.\u003c/p\u003e\n\u003cp\u003eMicrosoft have a list of Unified Communications Certificate Providers detailed here: \u003ca href=\"https://support.microsoft.com/en-us/kb/929395\"\u003ehttps://support.microsoft.com/en-us/kb/929395\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eWindows now automatically downloads Trusted Root certificates when you access a web page on HTTPS.  We can exploit this to get all Trusted Root certificates on our Edge servers which is required for Federation to work correctly.  An example of this is where you only get one way IM or a federated partner may see your presence as unknown.\u003c/p\u003e","title":"Skype for Business (Lync) – Easiest way to add trusted root certificate authorities to Edge"},{"content":"I recently came across an error where the Cluster Service stopped on a Windows Server 2012 R2 failover cluster and would not start. Event Logs generated were:\nEvent ID: 7024\nThe Cluster Service service terminated with the following service-specific error:\nKeyset does not exist\nEvent ID: 7031\nThe Cluster Service service terminated unexpectedly. It has done this 282 time(s). The following corrective action will be taken in 60000 milliseconds: Restart the service.\nAfter numerous failed attempts to get the Cluster Service to start I evicted the node from the cluster and ran Clear-Clusternode. When joining the node back into the cluster I got the error \u0026ldquo;Keyset does not exist\u0026rdquo; once again.\nThe fix was to correct the permissions on the C:\\ProgramData\\Microsoft\\Crypto\\RSA folder.\nEvery item (System File) under the MachineKeys folder should be configured as follows:\nInheritence - Off\nOwner : Administrators\nSYSTEM - Full Control\nAdministrators - Full Control\nOnce the permissions have been set correctly on the MachineKeys items, the MachineKeys folder should be set as follows:\nInheritence - Off\nOwner: Administrators\nAdministrators - Full Control (This folder only)\nEveryone - Read + Write (This folder only)\nAfter the above permissions were set I was able to join the node back to the cluster and the cluster service started. I still haven\u0026rsquo;t found a root cause as to why the permissions changed. I was able to identify the correct permissions by looking at a working cluster node.\n","permalink":"https://chrishayward.co.uk/2015/07/02/windows-server-2012-r2-add-cluster-node-cluster-service-keyset-does-not-exist/","summary":"\u003cp\u003eI recently came across an error where the Cluster Service stopped on a Windows Server 2012 R2 failover cluster and would not start.  Event Logs generated were:\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eEvent ID: 7024\u003c/em\u003e\u003cbr\u003e\n\u003cem\u003eThe Cluster Service service terminated with the following service-specific error:\u003c/em\u003e\u003cbr\u003e\n\u003cem\u003eKeyset does not exist\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eEvent ID: 7031\u003cbr\u003e\nThe Cluster Service service terminated unexpectedly. It has done this 282 time(s). The following corrective action will be taken in 60000 milliseconds: Restart the service.\u003c/em\u003e\u003c/p\u003e","title":"Windows Server 2012 R2 – Add cluster node / Cluster Service \"Keyset does not exist\""},{"content":"I have recently encountered a strange issue where all 3 Front End servers in the same pool ran out of disk space at the same time. When investigating both sqlservr.exe processes (RTCLOCAL and LYNCLOCAL) were consuming the whole page file (or all of the available space on C: as the pagefile was system managed). In Resource Monitor I could see the commit for both sqlservr.exe processes was extremely high. Apologies for the poor images, I was using iMessage to send the images to a colleague and didn\u0026rsquo;t screenshot:\nAs you can see the Available Memory is 26.6GB but Commited is 67.4GB/67.9GB and Resource Monitor shows sqlservr.exe consuming it all. Restarting the server caused the pagefile to increase rapidly and fill the disk space again. I set the page file size manually to stop the consumption of disk space but this also filled immediately after a restart causing the server to be unresponsive.\nTo resolve I updated the local SQL Express instances to Service Pack 2. They were still running RTM. Lync was CU10 and Windows 2012 R2 was patched up to March 2015.\nThe following post explains how to update the Lync Front Ends to SQL Express SP1 and the same process works for SP2: http://www.shudnow.net/2013/06/04/updating-sql-2012-express-to-sp1-on-lync-2013-servers/. I did notice that I needed to restart after updating each instance. So for each Front End:\nStop both SQL services to stop consumption of pagefile SQLEXPR_x64_ENU.exe /ACTION=Patch /INSTANCENAME=RTCLOCAL /QS /HIDECONSOLE /IAcceptSQLServerLicenseTerms Restart Server SQLEXPR_x64_ENU.exe /ACTION=Patch /INSTANCENAME=LYNCLOCAL /QS /HIDECONSOLE /IAcceptSQLServerLicenseTerms Restart Server SQL Express SP2 can be downloaded from here: http://www.microsoft.com/en-gb/download/details.aspx?id=43351.\nAfter each SQL Express instance was updated the commit for the SQL processes was much lower (around 300,000KB). Once all Lync FE\u0026rsquo;s were back online the Lync Front End service would not start. Get-CsPoolFabricState and the Lync event logs indicated I needed to run Reset-CsPoolRegistrarState, details here: https://technet.microsoft.com/en-gb/library/jj619172.aspx?f=255\u0026amp;MSPPError=-2147217396\nThe SCCM 2012 R2 CU4 client had recently been pushed out to all machines at the same time the problem started. I suspect this was the root cause, although could not find anything concrete.\nIn summary:\nDon\u0026rsquo;t push out updates to all FE\u0026rsquo;s (or any Lync role) at the same time (Including SCCM, SCOM etc) Ensure that you update the local SQL Express instances on your Lync servers ","permalink":"https://chrishayward.co.uk/2015/04/17/lync-page-file-causes-front-end-to-run-out-of-disk-space-sqlservr-exe-and-pagefile/","summary":"\u003cp\u003eI have recently encountered a strange issue where all 3 Front End servers in the same pool ran out of disk space at the same time.  When investigating both sqlservr.exe processes (RTCLOCAL and LYNCLOCAL) were consuming the whole page file (or all of the available space on C: as the pagefile was system managed).  In Resource Monitor I could see the commit for both sqlservr.exe processes was extremely high.  Apologies for the poor images, I was using iMessage to send the images to a colleague and didn\u0026rsquo;t screenshot:\u003c/p\u003e","title":"Lync – Page file causes Front End to run out of disk space (sqlservr.exe and pagefile)"},{"content":"I recently came across an issue where the SCCM 2012 R2 Client would not install on one machine (OS Server 2012 R2). The machine had previously had a working SCCM client that was updated to CU4. The Configuration Manager icon in Control Panel was still visible, but when opening it all of the values were blank.\nI was also unable to uninstall the client using ccmsetup.exe /uninstall. Forcing an install from the SCCM Console and selecting uninstall previous SCCM clients also did not work.\nThe error in ccmsetup.log was: MSI: Setup was unable to compile the file AppSynclet_Local.mof\nThe resolution was to run ccmsetup.exe manually and specify PATCH=(msp file for CU4)\nI copied the \\\\\\SMS_\\Client directory and the CU4 msp file to D:\\SCCM on the machine then ran the command:\nccmsetup.exe PATCH=D:\\SCCM\\configmgr2012ac-r2-kb3026739-x64.msp This successfully installed the SCCM Client.\n","permalink":"https://chrishayward.co.uk/2015/04/17/sccm-client-wont-install-or-install/","summary":"\u003cp\u003eI recently came across an issue where the SCCM 2012 R2 Client would not install on one machine (OS Server 2012 R2).  The machine had previously had a working SCCM client that was updated to CU4.  The Configuration Manager icon in Control Panel was still visible, but when opening it all of the values were blank.\u003c/p\u003e\n\u003cp\u003eI was also unable to uninstall the client using ccmsetup.exe /uninstall.  Forcing an install from the SCCM Console and selecting uninstall previous SCCM clients also did not work.\u003c/p\u003e","title":"SCCM – 2012 R2 Client won't install or uninstall"},{"content":"Microsoft detail how to move users from Lync On-Prem to Lync Online and how to bulk move users in an OU or with a particular AD attribute: https://technet.microsoft.com/en-us/library/jj204969%28v=ocs.15%29.aspx?f=255\u0026amp;MSPPError=-2147217396.\nIf you want to bulk move users to Lync Online from a CSV you can use the PowerShell below:\n$creds=Get-Credential Import-Csv movelyncusers.csv -Header Identity | Foreach-Object {Move-CsUser -Identity $_.identity -Target sipfed.online.lync.com -Credential $creds -HostedMigrationOverrideUrl https://admin1e.online.lync.com/HostedMigration/hostedmigrationService.svc} movelyncusers.csv should contain a list of the UPNs of the users you wish to move. No headings are required.\n","permalink":"https://chrishayward.co.uk/2015/04/17/lync-move-on-prem-users-to-lync-online-from-csv/","summary":"\u003cp\u003eMicrosoft detail how to move users from Lync On-Prem to Lync Online and how to bulk move users in an OU or with a particular AD attribute: \u003ca href=\"https://technet.microsoft.com/en-us/library/jj204969%28v=ocs.15%29.aspx?f=255\u0026amp;MSPPError=-2147217396\"\u003ehttps://technet.microsoft.com/en-us/library/jj204969%28v=ocs.15%29.aspx?f=255\u0026amp;MSPPError=-2147217396\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eIf you want to bulk move users to Lync Online from a CSV you can use the PowerShell below:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-powershell\" data-lang=\"powershell\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$creds\u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"nb\"\u003eGet-Credential\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eImport-Csv\u003c/span\u003e \u003cspan class=\"n\"\u003emovelyncusers\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"py\"\u003ecsv\u003c/span\u003e \u003cspan class=\"n\"\u003e-Header\u003c/span\u003e \u003cspan class=\"n\"\u003eIdentity\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"nb\"\u003eForeach-Object\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"nb\"\u003eMove-CsUser\u003c/span\u003e \u003cspan class=\"n\"\u003e-Identity\u003c/span\u003e \u003cspan class=\"nv\"\u003e$_\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"py\"\u003eidentity\u003c/span\u003e \u003cspan class=\"n\"\u003e-Target\u003c/span\u003e \u003cspan class=\"n\"\u003esipfed\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"py\"\u003eonline\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"py\"\u003elync\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"py\"\u003ecom\u003c/span\u003e \u003cspan class=\"n\"\u003e-Credential\u003c/span\u003e \u003cspan class=\"nv\"\u003e$creds\u003c/span\u003e \u003cspan class=\"n\"\u003e-HostedMigrationOverrideUrl\u003c/span\u003e \u003cspan class=\"n\"\u003ehttps\u003c/span\u003e\u003cspan class=\"err\"\u003e:\u003c/span\u003e\u003cspan class=\"p\"\u003e//\u003c/span\u003e\u003cspan class=\"n\"\u003eadmin1e\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"py\"\u003eonline\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"py\"\u003elync\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecom\u003c/span\u003e\u003cspan class=\"p\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eHostedMigration\u003c/span\u003e\u003cspan class=\"p\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003ehostedmigrationService\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esvc\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003emovelyncusers.csv should contain a list of the UPNs of the users you wish to move.  No headings are required.\u003c/p\u003e","title":"Lync – Move On Prem users to Lync Online from CSV"},{"content":"A customer was having problems with their Lync 2010 deployment federating with Office 365. When searching for a Lync Online user they would see \u0026ldquo;Presence Unknown\u0026rdquo; and be unable to send Instant Messages. They could Federate with other On-Prem Lync organisations OK. They had LyncOnline configured as a Hosted Provider and Partner Domain Discovery Enabled (Dynamic Federation). Their _sipfederationtls._tcp DNS record was configured correctly as was the O365 customer.\nUsing OCSLogger and Snooper on the Edge server I was able to spot the problem.\n504 Server time-out\nms-diagnostics: 110;reason=\u0026ldquo;Certificate trust with another server could not be established\u0026rdquo;;\u0026ldquo;ErrorType=\u0026ldquo;The peer certificate does not contain a matching FQDN\u0026rdquo;\nThe next thing I checked was the certificate assigned to the External Edge to discover it was a Wildcard Certificate. From experience I know that Office 365 Federation does not work unless you have a valid SAN entry on your Edge certificate. It must match your SIP domain and the host in your _sipfederationtls SRV record. The customer purchased a SAN certificate and now Office 365/Lync Online Federation works.\nJust one to watch, although interesting that Federation with On-Prem and External User access seemed to work with the Wildcard cert. Microsoft state a SAN certificate is required for Edge servers.\nLinks: Certificate requirements for external user access in Lync Server 2013: https://technet.microsoft.com/en-GB/library/gg398920.aspx\n","permalink":"https://chrishayward.co.uk/2015/04/02/lync-office-365-federation-presence-unknown/","summary":"\u003cp\u003eA customer was having problems with their Lync 2010 deployment federating with Office 365.  When searching for a Lync Online user they would see \u0026ldquo;Presence Unknown\u0026rdquo; and be unable to send Instant Messages.  They could Federate with other On-Prem Lync organisations OK.  They had LyncOnline configured as a Hosted Provider and Partner Domain Discovery Enabled (Dynamic Federation).  Their _sipfederationtls._tcp DNS record was configured correctly as was the O365 customer.\u003c/p\u003e\n\u003cp\u003eUsing OCSLogger and Snooper on the Edge server I was able to spot the problem.\u003c/p\u003e","title":"Lync – Office 365 Federation Presence Unknown"},{"content":"I recently ran into a problem with Checkpoint Firewalls on a Lync 2010 deployment. The customer already had a single 2010 Front End and wished to enable external sign in over the internet as it did not work over their VPN solution (Direct Access). I installed the Edge server and Reverse Proxy but then encountered a strange issue where I was unable to sign in over the Edge server. Some of the troubleshooting steps I took (Thinking it was my fault):\nVerified Reverse Proxy worked correctly Verified all Edge services were started Verified all URLs and IP addresses in Topology Builder were correct Installed latest CU Updates on Edge and FE (including DB updates) Verified all root and intermediate certs were on Edge and FE in the correct stores Verified all certificates were correct Verified all ports were open using MS Port Query Tool and Edge Port Tester (Available here: http://www.mylynclab.com/2014/02/lync-edge-testing-suite-part-1-lync.html) Verified that all internal and public DNS entries were correct Verified CMS replication was working between FE and Edge. Verified time and time zone on Edge server Verified NIC config on Edge server and Static Routes. Using OCSLogger and Snooper I was able to verify that the Lync client was hitting the Edge server but no SIP messages were hitting the Lync Front End. The following error could be seen on the Edge Server.\nError\nTL_ERROR(TF_DIAG) [1]2BD8.2798::02/11/2015-16:37:36.771.001d4d31 (SIPStack,SIPAdminLog::TraceDiagRecord:SIPAdminLog.cpp(143))$$begin_record LogType: diagnostic Severity: error Text: Message expired in the outbound queue before it could be sent SIP-Start-Line: SUBSCRIBE sip:user.domain SIP/2.0 SIP-Call-ID: 450156f49d2549ce91da9c1bd1699750 SIP-CSeq: 1 SUBSCRIBE Peer: edge.domain:5061 $$end_record I should also mention the customers network config was outsourced so I had no access to the Firewalls or to view the rules. I then came across this post: http://lync2013blog.blogspot.co.uk/2014/04/lync2013-and-checkpoint-firewall.html\nI asked the customers network support to look at that post and ensure that the firewalls were not doing any Layer 7 inspection of SIP traffic. Network support verified the rules had been implemented but Lync sign in still would not work. I then logged a case with MS Support and we went through the motions of troubleshooting. Their support guy came to the same conclusion that SIP messages were not getting from Edge to Front End and vice versa (Even though I could see the ports were open). The network support guy also verified he could not see any dropped packets between Edge and Front End.\nTo cut a long story short it turned out that network support had only changed the TCP/5061 rule on the perimeter firewall and not the firewall between Edge and Front End (used for Federation). As soon as they changed the rule on the inside Firewall Lync sign-in over Edge worked immediately.\nSo in summary if you are using Checkpoint Firewalls, the default rule of SIP 5061 will do layer 7 inspection of SIP and will not work with Lync. You need to ensure that you create a standard port of TCP 5061 on your perimeter firewall (For federation) and internal firewall (between internal Edge and Front End).\n","permalink":"https://chrishayward.co.uk/2015/03/24/lync-unable-to-sign-in-via-edge-checkpoint-firewalls/","summary":"\u003cp\u003eI recently ran into a problem with Checkpoint Firewalls on a Lync 2010 deployment.  The customer already had a single 2010 Front End and wished to enable external sign in over the internet as it did not work over their VPN solution (Direct Access).  I installed the Edge server and Reverse Proxy but then encountered a strange issue where I was unable to sign in over the Edge server.  Some of the troubleshooting steps I took (Thinking it was my fault):\u003c/p\u003e","title":"Lync – Unable to sign in via Edge (Checkpoint Firewalls)"},{"content":"A common problem in the UK is that companies Active Directory telephone numbers will be populated in the format:\n+44 (0) 123 456 7891 or +44(0)1234567891\nIf you were to dial these numbers in the UK you would omit the +44 and just dial the 0. If you are abroad you would dial +44 and omit the 0 (E164 format).\nAs part of the default Lync normalization rules it will remove all spaces and brackets (). When using Lync click to call from a users contact card this normalizes the number to +4401234567891 which is invalid. Therefore you need to either correct all numbers in AD to E164 format or add a normalization rule to the Company_Phone_Number_Normalization_Rules.txt file on your Lync File Share. This is already well documented here:\nhttp://technet.microsoft.com/en-us/library/bb936613(v=office.12).aspx\nhttp://blog.schertz.name/2010/09/lync-2010-address-book-normalization/\nI did find some other posts about stripping the brackets and zero but I found these rules didn\u0026rsquo;t account for if there was a space before or after the brackets and anywhere else in the number. This is the normalization rule I use:\nCompany_Phone_Number_Normalization_Rules.txt\n# Normalize UK numbers that have a +44 (0) prefix with or without spaces # +44 (0) 123 456 7891 would become +441234567891 # +44(0)1234567891 would become +441234567891 ^\\+44[\\s]*\\(0\\)[\\s]*([\\d \\ ]*)$ +44$1 ","permalink":"https://chrishayward.co.uk/2014/11/18/lync-uk-44-0-company_phone_number_normalization_rules-txt/","summary":"\u003cp\u003eA common problem in the UK is that companies Active Directory telephone numbers will be populated in the format:\u003c/p\u003e\n\u003cp\u003e+44 (0) 123 456 7891 or +44(0)1234567891\u003c/p\u003e\n\u003cp\u003eIf you were to dial these numbers in the UK you would omit the +44 and just dial the 0.  If you are abroad you would dial +44 and omit the 0 (E164 format).\u003c/p\u003e\n\u003cp\u003eAs part of the default Lync normalization rules it will remove all spaces and brackets ().  When using Lync click to call from a users contact card this normalizes the number to +4401234567891 which is invalid.  Therefore you need to either correct all numbers in AD to E164 format or add a normalization rule to the Company_Phone_Number_Normalization_Rules.txt file on your Lync File Share.  This is already well documented here:\u003c/p\u003e","title":"Lync – UK +44 (0) Company_Phone_Number_Normalization_Rules.txt"},{"content":"This simple script will summarise how many users are assigned each policy in Lync as well as how many users are against each registrar pool.\n# Author: Created by Weakest Lync, www.WeakestLync.com # Purpose: Script to show the number of users assigned each policy # Version: 1.0 # Changes: DATE - Change # 09/11/2014 - Release 1.0 $users = Get-CsUser Write-Host \u0026#34;Registrar Pool Sumamry\u0026#34; -ForegroundColor Yellow $users | Group-Object RegistrarPool | Select-Object Count, Name Write-Host \u0026#34;Voice Policy Summary\u0026#34; -ForegroundColor Yellow $users | Group-Object VoicePolicy | Select-Object Count, Name Write-Host \u0026#34;Dial Plan Summary\u0026#34; -ForegroundColor Yellow $users | Group-Object DialPlan | Select-Object Count, Name Write-Host \u0026#34;Conferencing Policy Summary\u0026#34; -ForegroundColor Yellow $users | Group-Object ConferencingPolicy | Select-Object Count, Name Write-Host \u0026#34;External Access Summary\u0026#34; -ForegroundColor Yellow $users | Group-Object ExternalAccessPolicy | Select-Object Count, Name Write-Host \u0026#34;Location Policy Summary\u0026#34; -ForegroundColor Yellow $users | Group-Object LocationPolicy | Select-Object Count, Name Write-Host \u0026#34;Client Policy Summary\u0026#34; -ForegroundColor Yellow $users | Group-Object ClientPolicy | Select-Object Count, Name Write-Host \u0026#34;Archiving Policy Sumamry\u0026#34; -ForegroundColor Yellow $users | Group-Object ArchivingPolicy | Select-Object Count, Name Write-Host \u0026#34;Pin Policy Sumamry\u0026#34; -ForegroundColor Yellow $users | Group-Object PinPolicy | Select-Object Count, Name Write-Host \u0026#34;Mobility Policy Sumamry\u0026#34; -ForegroundColor Yellow $users | Group-Object MobilityPolicy | Select-Object Count, Name Write-Host \u0026#34;Persistent Chat Policy Sumamry\u0026#34; -ForegroundColor Yellow $users | Group-Object PersistentChatPolicy | Select-Object Count, Name Write-Host \u0026#34;Hosted Voicemail Policy Sumamry\u0026#34; -ForegroundColor Yellow $users | Group-Object HostedVoicemailPolicy | Select-Object Count, Name ","permalink":"https://chrishayward.co.uk/2014/11/09/lync-2013-script-policy-summary-lyncpolicysummary-ps1/","summary":"\u003cp\u003eThis simple script will summarise how many users are assigned each policy in Lync as well as how many users are against each registrar pool.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/wp-content/uploads/2014/11/lync-policysummary.jpg\"\u003e\u003cimg alt=\"Lync-PolicySummary\" loading=\"lazy\" src=\"/wp-content/uploads/2014/11/lync-policysummary.jpg?w=630\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-powershell\" data-lang=\"powershell\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Author: Created by Weakest Lync, www.WeakestLync.com\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Purpose: Script to show the number of users assigned each policy\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Version: 1.0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Changes: DATE - Change\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# 09/11/2014 - Release 1.0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$users\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"nb\"\u003eGet-CsUser\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eWrite-Host\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Registrar Pool Sumamry\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003e-ForegroundColor\u003c/span\u003e \u003cspan class=\"n\"\u003eYellow\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$users\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"nb\"\u003eGroup-Object\u003c/span\u003e \u003cspan class=\"n\"\u003eRegistrarPool\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"nb\"\u003eSelect-Object\u003c/span\u003e \u003cspan class=\"n\"\u003eCount\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eName\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eWrite-Host\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Voice Policy Summary\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003e-ForegroundColor\u003c/span\u003e \u003cspan class=\"n\"\u003eYellow\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$users\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"nb\"\u003eGroup-Object\u003c/span\u003e \u003cspan class=\"n\"\u003eVoicePolicy\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"nb\"\u003eSelect-Object\u003c/span\u003e \u003cspan class=\"n\"\u003eCount\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eName\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eWrite-Host\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Dial Plan Summary\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003e-ForegroundColor\u003c/span\u003e \u003cspan class=\"n\"\u003eYellow\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$users\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"nb\"\u003eGroup-Object\u003c/span\u003e \u003cspan class=\"n\"\u003eDialPlan\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"nb\"\u003eSelect-Object\u003c/span\u003e \u003cspan class=\"n\"\u003eCount\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eName\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eWrite-Host\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Conferencing Policy Summary\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003e-ForegroundColor\u003c/span\u003e \u003cspan class=\"n\"\u003eYellow\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$users\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"nb\"\u003eGroup-Object\u003c/span\u003e \u003cspan class=\"n\"\u003eConferencingPolicy\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"nb\"\u003eSelect-Object\u003c/span\u003e \u003cspan class=\"n\"\u003eCount\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eName\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eWrite-Host\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;External Access Summary\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003e-ForegroundColor\u003c/span\u003e \u003cspan class=\"n\"\u003eYellow\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$users\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"nb\"\u003eGroup-Object\u003c/span\u003e \u003cspan class=\"n\"\u003eExternalAccessPolicy\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"nb\"\u003eSelect-Object\u003c/span\u003e \u003cspan class=\"n\"\u003eCount\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eName\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eWrite-Host\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Location Policy Summary\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003e-ForegroundColor\u003c/span\u003e \u003cspan class=\"n\"\u003eYellow\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$users\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"nb\"\u003eGroup-Object\u003c/span\u003e \u003cspan class=\"n\"\u003eLocationPolicy\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"nb\"\u003eSelect-Object\u003c/span\u003e \u003cspan class=\"n\"\u003eCount\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eName\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eWrite-Host\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Client Policy Summary\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003e-ForegroundColor\u003c/span\u003e \u003cspan class=\"n\"\u003eYellow\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$users\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"nb\"\u003eGroup-Object\u003c/span\u003e \u003cspan class=\"n\"\u003eClientPolicy\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"nb\"\u003eSelect-Object\u003c/span\u003e \u003cspan class=\"n\"\u003eCount\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eName\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eWrite-Host\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Archiving Policy Sumamry\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003e-ForegroundColor\u003c/span\u003e \u003cspan class=\"n\"\u003eYellow\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$users\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"nb\"\u003eGroup-Object\u003c/span\u003e \u003cspan class=\"n\"\u003eArchivingPolicy\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"nb\"\u003eSelect-Object\u003c/span\u003e \u003cspan class=\"n\"\u003eCount\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eName\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eWrite-Host\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Pin Policy Sumamry\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003e-ForegroundColor\u003c/span\u003e \u003cspan class=\"n\"\u003eYellow\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$users\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"nb\"\u003eGroup-Object\u003c/span\u003e \u003cspan class=\"n\"\u003ePinPolicy\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"nb\"\u003eSelect-Object\u003c/span\u003e \u003cspan class=\"n\"\u003eCount\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eName\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eWrite-Host\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Mobility Policy Sumamry\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003e-ForegroundColor\u003c/span\u003e \u003cspan class=\"n\"\u003eYellow\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$users\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"nb\"\u003eGroup-Object\u003c/span\u003e \u003cspan class=\"n\"\u003eMobilityPolicy\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"nb\"\u003eSelect-Object\u003c/span\u003e \u003cspan class=\"n\"\u003eCount\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eName\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eWrite-Host\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Persistent Chat Policy Sumamry\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003e-ForegroundColor\u003c/span\u003e \u003cspan class=\"n\"\u003eYellow\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$users\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"nb\"\u003eGroup-Object\u003c/span\u003e \u003cspan class=\"n\"\u003ePersistentChatPolicy\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"nb\"\u003eSelect-Object\u003c/span\u003e \u003cspan class=\"n\"\u003eCount\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eName\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eWrite-Host\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Hosted Voicemail Policy Sumamry\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003e-ForegroundColor\u003c/span\u003e \u003cspan class=\"n\"\u003eYellow\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$users\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"nb\"\u003eGroup-Object\u003c/span\u003e \u003cspan class=\"n\"\u003eHostedVoicemailPolicy\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"nb\"\u003eSelect-Object\u003c/span\u003e \u003cspan class=\"n\"\u003eCount\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eName\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"Lync 2013 – Script Policy Summary – LyncPolicySummary.ps1"},{"content":"The scenario is a migration from Lync 2010 to Lync 2013 in a new Active Directory forest and want to migrate users buddy lists.\nYou run DBIMPEXP.EXE on the Lync 2010 environment to export the user data to XML. On the 2013 system you convert the XML to Lync 2013 format then run Import-CsUserData.\nConvert-CsUserData -inputfile C:temp2010UserData.xml -outputfile C:temp2013UserData_Converted.zip -targetversion Current Import-CsUserData -PoolFqdn \u0026#34;fpool01.domain.local\u0026#34; -FileName \u0026#34;C:temp2013UserData_Converted.zip\u0026#34; When running Import-CsUserData you get the error:\nPS C:Usersusername\u0026gt; Import-CsUserData -PoolFqdn \u0026#34;fpool01.domain.local\u0026#34; -FileName \u0026#34;C:temp2013UserData_Converted.zip\u0026#34; Import-CsUserData : \u0026#39;@\u0026#39; is an unexpected token. The expected token is \u0026#39;;\u0026#39;. Line 1364, position 39. At line:1 char:1 + Import-CsUserData -PoolFqdn \u0026#34;fpool01.domain.local\u0026#34; -FileName \u0026#34;C:temp2 ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (C:Usersuserna...mpExpImport.Zip:String) [Import-CsUserData], XmlException + FullyQualifiedErrorId : ExportFailure.IO,Microsoft.Rtc.Management.BlobStore.ImportOcsUserStoreDataCmdlet If you look at line 1364 you will notice that the users SIP address has an \u0026ldquo;\u0026amp;\u0026rdquo; (amersand). To fix I removed the users entry from the XML (All lines from \u0026lt;app:DocItem Name= to line \u0026lt;/app:DocItem\u0026gt;) and zipped the files again. The import then ran successfully.\n","permalink":"https://chrishayward.co.uk/2014/11/09/lync-2013-import-csuserdata-error/","summary":"\u003cp\u003eThe scenario is a migration from Lync 2010 to Lync 2013 in a new Active Directory forest and want to migrate users buddy lists.\u003c/p\u003e\n\u003cp\u003eYou run DBIMPEXP.EXE on the Lync 2010 environment to export the user data to XML.  On the 2013 system you convert the XML to Lync 2013 format then run Import-CsUserData.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-powershell\" data-lang=\"powershell\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eConvert-CsUserData\u003c/span\u003e \u003cspan class=\"n\"\u003e-inputfile\u003c/span\u003e \u003cspan class=\"n\"\u003eC:temp2010UserData\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"py\"\u003exml\u003c/span\u003e \u003cspan class=\"n\"\u003e-outputfile\u003c/span\u003e \u003cspan class=\"n\"\u003eC:temp2013UserData_Converted\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"py\"\u003ezip\u003c/span\u003e \u003cspan class=\"n\"\u003e-targetversion\u003c/span\u003e \u003cspan class=\"n\"\u003eCurrent\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eImport-CsUserData\u003c/span\u003e \u003cspan class=\"n\"\u003e-PoolFqdn\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;fpool01.domain.local\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003e-FileName\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;C:temp2013UserData_Converted.zip\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eWhen running Import-CsUserData you get the error:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-powershell\" data-lang=\"powershell\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ePS \u003c/span\u003e\u003cspan class=\"n\"\u003eC:Usersusername\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"nb\"\u003eImport-CsUserData\u003c/span\u003e \u003cspan class=\"n\"\u003e-PoolFqdn\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;fpool01.domain.local\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003e-FileName\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;C:temp2013UserData_Converted.zip\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eImport-CsUserData\u003c/span\u003e \u003cspan class=\"err\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;@\u0026#39;\u003c/span\u003e \u003cspan class=\"n\"\u003eis\u003c/span\u003e \u003cspan class=\"n\"\u003ean\u003c/span\u003e \u003cspan class=\"n\"\u003eunexpected\u003c/span\u003e \u003cspan class=\"n\"\u003etoken\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e \u003cspan class=\"n\"\u003eThe\u003c/span\u003e \u003cspan class=\"n\"\u003eexpected\u003c/span\u003e \u003cspan class=\"n\"\u003etoken\u003c/span\u003e \u003cspan class=\"n\"\u003eis\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e \u003cspan class=\"n\"\u003eLine\u003c/span\u003e \u003cspan class=\"mf\"\u003e1364\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"na\"\u003eposition\u003c/span\u003e \u003cspan class=\"mf\"\u003e39\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eAt\u003c/span\u003e \u003cspan class=\"n\"\u003eline\u003c/span\u003e\u003cspan class=\"err\"\u003e:\u003c/span\u003e\u003cspan class=\"mf\"\u003e1\u003c/span\u003e \u003cspan class=\"n\"\u003echar\u003c/span\u003e\u003cspan class=\"err\"\u003e:\u003c/span\u003e\u003cspan class=\"mf\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e+\u003c/span\u003e \u003cspan class=\"nb\"\u003eImport-CsUserData\u003c/span\u003e \u003cspan class=\"n\"\u003e-PoolFqdn\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;fpool01.domain.local\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003e-FileName\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;C:temp2 ...\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e+ CategoryInfo : InvalidOperation: (C:Usersuserna...mpExpImport.Zip:String) [Import-CsUserData], XmlException\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e+ FullyQualifiedErrorId : ExportFailure.IO,Microsoft.Rtc.Management.BlobStore.ImportOcsUserStoreDataCmdlet\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eIf you look at line 1364 you will notice that the users SIP address has an \u0026ldquo;\u0026amp;\u0026rdquo; (amersand).  To fix I removed the users entry from the XML (All lines from \u0026lt;app:DocItem Name= to line \u0026lt;/app:DocItem\u0026gt;) and zipped the files again.  The import then ran successfully.\u003c/p\u003e","title":"Lync 2013 – Import-CsUserData Error"},{"content":"http://busylight.com/\nI recently received a Busylight to test from Kuando.\nInside the box you receive a Busylight USB device, a sticky pad to attach the device to your desk or screen and some brief instructions. The Busylight itself is constructed from black plastic base with an aluminium main body.\nInstallation is very simple, download and install the software from the Busylight website: http://www.busylight.com/support/lync\nBusylight runs in the system tray and starts at system startup. You can right click on the Busylight icon in the system tray to access menu features. You can change the speaker volume and make changes to the colours Busylight flashes. It\u0026rsquo;s worth noting that you can also fully customise the colours using registry settings.\nThe version of Busylight software I\u0026rsquo;m using also allows you to configure some nice features such as second call treatment and hotkeys.\nThe Busylight itself does what it says, it changes colour based on your Lync presence status. It\u0026rsquo;s useful if everyone in your Office understands what it means (Busylight do provide posters you can print to raise awareness). E.g. if you are set to \u0026ldquo;Busy\u0026rdquo; a person knows not to walk over to you.\nFrom my own experience, the best feature is when you are receiving inbound Lync IM\u0026rsquo;s or calls. I haven\u0026rsquo;t took a photograph but Busylight will flash blue when you receive an IM or a call. Busylight also has an inbuilt speaker and acts as your ringer when receiving calls, even while your machine is locked. This is great for headset users (like myself) who usually rely on inbuilt laptop speakers and Lync toasts.\nAvailable (Green)\nAway (Yellow)\nBusy (Red)Do Not Disturb (Pink) If you are not happy with the default colours out the box, the Busylight software allows you to change some of them from the system tray. E.g. DND can be set to pulse red rather than solid pink. You can also customise the colours via the registry although I would imagine you would want to set these via GPO.\nOverall I can certainly see the advantages of Busylight. It works really well and there are regular updates to the software adding new features. I also believe there is an API to customise Busylight further. For Busylight to work for its intended purposes people need to be educated on presence etiquette. It\u0026rsquo;s certainly very useful if you are a headset user as the inbuilt speaker rings more like a VOIP phone. I would like the ability to set custom ringtones as I\u0026rsquo;m not a huge fan of the inbuilt tones. I could also see these being useful mounted outside meeting rooms or managers offices. USB extension cable may be required!\n","permalink":"https://chrishayward.co.uk/2014/06/20/review-kuando-busylight-uc-for-microsoft-lync/","summary":"\u003cp\u003e\u003ca href=\"http://busylight.com/\"\u003ehttp://busylight.com/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eI recently received a Busylight to test from Kuando.\u003c/p\u003e\n\u003cp\u003eInside the box you receive a Busylight USB device, a sticky pad to attach the device to your desk or screen and some brief instructions. The Busylight itself is constructed from black plastic base with an aluminium main body.\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/wp-content/uploads/2014/06/062014_1451_reviewkuand1.jpg\"\u003e\u003cimg loading=\"lazy\" src=\"/wp-content/uploads/2014/06/062014_1451_reviewkuand2.jpg\"\u003e\u003c/p\u003e\n\u003cp\u003eInstallation is very simple, download and install the software from the Busylight website: \u003ca href=\"http://www.busylight.com/support/lync\"\u003ehttp://www.busylight.com/support/lync\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eBusylight runs in the system tray and starts at system startup. You can right click on the Busylight icon in the system tray to access menu features. You can change the speaker volume and make changes to the colours Busylight flashes. It\u0026rsquo;s worth noting that you can also fully customise the colours using registry settings.\u003c/p\u003e","title":"Review: Kuando Busylight UC for Microsoft Lync"},{"content":"When you deploy Lync and assign internal certificates to your Lync servers (E.g. Front End, Internal Edge, SBA and Gateways) by default you will only have a 2 year certificate from the \u0026ldquo;Web Server\u0026rdquo; template. I like to create a new Certificate Template for Lync with a 5 year lifespan as it can be quite annoying having to renew certificates, especially on the Edge servers and Gateways where you have to export the cert request. I have tried creating a 10 year Certificate Template but the Lync Deployment Wizard complains that the cert is valid for over 5 years. It\u0026rsquo;s also a good idea to set your Certificate Authority validity period to a long period, I usually opt for 20/25 years. This article will cover how to create a 5 year Certificate Template for Lync. By assigning Certificates to your Lync servers with a longer validity period you won\u0026rsquo;t have to renew them as often.\nFirst of all, open Certification Authority console. Right click \u0026ldquo;Certificate Templates\u0026rdquo; and click \u0026ldquo;Manage\u0026rdquo;.\nNow we will duplicate the default Web Server certificate. In the Certificate Templates Console right click \u0026ldquo;Web Server\u0026rdquo; and click \u0026ldquo;Duplicate Template\u0026rdquo;.\nClick the \u0026ldquo;General\u0026rdquo; tab. Enter a display name (e.g. LyncServer) and change the validity period to 5 years. Click \u0026ldquo;Apply\u0026rdquo;. You should also check that the Private Key is exportable in the Request Handling tab.\nBack in the Certification Authority console, right click \u0026ldquo;Certificate Templates\u0026rdquo;, click \u0026ldquo;New\u0026rdquo; \u0026gt; \u0026ldquo;Certificate Template to Issue\u0026rdquo;.\nIn the \u0026ldquo;Enable Certificate Templates\u0026rdquo; window, select \u0026ldquo;LyncServer\u0026rdquo; and click \u0026ldquo;OK\u0026rdquo;\nNext we need to allow the Certificate Authority to issue certificates that are valid for more than 2 years. From an elevated command prompt (run as administrator) run the following:\n_certutil -setreg ca\\ValidityPeriodUnits 5\n_\nRestart the Certificate Authority service:\nWhen requesting internal Certificates in Lync Deployment Wizard you should now specify \u0026ldquo;LyncServer\u0026rdquo;:\nNow you don\u0026rsquo;t need to worry about Lync internal certs for 5 years.\nI recommend that you monitor your certificates expiry dates, SCOM works great for the certs on Lync servers. If you use TLS on your gateways you should make sure you monitor those certificates too with a third party application/script.\nUpdate 2015: This will also work for Skype For Business 2015, however I recommend naming the Template something more generic like \u0026ldquo;UCCert\u0026rdquo;.\n","permalink":"https://chrishayward.co.uk/2014/02/24/lync-create-certificate-template-with-a-validity-period/","summary":"\u003cp\u003eWhen you deploy Lync and assign internal certificates to your Lync servers (E.g. Front End, Internal Edge, SBA and Gateways) by default you will only have a 2 year certificate from the \u0026ldquo;Web Server\u0026rdquo; template. I like to create a new Certificate Template for Lync with a 5 year lifespan as it can be quite annoying having to renew certificates, especially on the Edge servers and Gateways where you have to export the cert request. I have tried creating a 10 year Certificate Template but the Lync Deployment Wizard complains that the cert is valid for over 5 years. It\u0026rsquo;s also a good idea to set your Certificate Authority validity period to a long period, I usually opt for 20/25 years. This article will cover how to create a 5 year Certificate Template for Lync.  By assigning Certificates to your Lync servers with a longer validity period you won\u0026rsquo;t have to renew them as often.\u003c/p\u003e","title":"Lync – Increase Internal Certificate Validity Period"},{"content":" Greig In Sydney: https://greiginsydney.com/ Inside Lync: http://blog.insidelync.com/ Jeff Schertz: http://blog.schertz.name/ Mastering Lync: http://masteringlync.com/ Matt Landis: http://windowspbx.blogspot.co.uk/ My Lync Lab: http://www.mylynclab.com/ Mark Vale: http://skype4b.uk/ Northern Lync: https://northernlync.wordpress.com/ Tom Arbuthnot: http://lyncdup.com/ UC Geek: http://ucgeek.co UC Ken: http://ucken.blogspot.co.uk/ ","permalink":"https://chrishayward.co.uk/lync-blogs/","summary":"\u003cul\u003e\n\u003cli\u003eGreig In Sydney: \u003ca href=\"https://greiginsydney.com/\"\u003ehttps://greiginsydney.com/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eInside Lync: \u003ca href=\"http://blog.insidelync.com/\"\u003ehttp://blog.insidelync.com/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eJeff Schertz: \u003ca href=\"http://blog.schertz.name/\"\u003ehttp://blog.schertz.name/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eMastering Lync: \u003ca href=\"http://masteringlync.com/\"\u003ehttp://masteringlync.com/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eMatt Landis: \u003ca href=\"http://windowspbx.blogspot.co.uk/\"\u003ehttp://windowspbx.blogspot.co.uk/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eMy Lync Lab: \u003ca href=\"http://www.mylynclab.com/\"\u003ehttp://www.mylynclab.com/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eMark Vale: \u003ca href=\"http://skype4b.uk/\"\u003ehttp://skype4b.uk/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eNorthern Lync: \u003ca href=\"https://northernlync.wordpress.com/\"\u003ehttps://northernlync.wordpress.com/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eTom Arbuthnot: \u003ca href=\"http://lyncdup.com/\"\u003ehttp://lyncdup.com/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUC Geek: \u003ca href=\"http://ucgeek.co\"\u003ehttp://ucgeek.co\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUC Ken: \u003ca href=\"http://ucken.blogspot.co.uk/\"\u003ehttp://ucken.blogspot.co.uk/\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e","title":"Lync Blogs"},{"content":"Troubleshooting Tools Microsoft Lync Server 2013 Debugging Tools. Install them on all of your Lync servers. Download them from here: http://www.microsoft.com/en-gb/download/details.aspx?id=35453\nWireshark. Install on all of your Lync servers to capture network packets. Top tips, use filter \u0026ldquo;sip\u0026rdquo; to view all SIP packets being sent and received. You can also point your Gateways syslog to your server running Wireshark and filter on \u0026ldquo;SYSLOG\u0026rdquo;. You can Download from here: http://www.wireshark.org/\nMicrosoft Port Query Tool with custom Lync XML. Install on all Lync servers to check correct network ports are open. See my post here: http://weakestlync.com/2013/10/25/lync-port-query-tool/\nRemote UC Troubleshooting Tool (RUCT). Use this to check DNS records and certificates. Download from here: http://www.insideocs.com/Tools/RUCT/RUCT.htm\nLync 2013 Pre-Call Diagnostic Tool. Use this tool on your clients to check for network metrics impacting media quality (MOS, Packet Loss and Jitter). Windows 7/8 Desktop app: http://www.microsoft.com/en-us/download/details.aspx?id=40733, Windows 8 Modern app: http://apps.microsoft.com/windows/en-us/app/9607fe33-2b51-403d-9615-c23f248e7c88\nDeployment Tools Lync Dialing Rule Optimzer. Use this tool to configure all of your normalization rules, voice policies and routes for you. http://www.lyncoptimizer.com/\nLync Validator. This tool is great for documenting Lync and figuring out what DNS entries/Certificates will be required. http://lyncvalidator.com\nClient Tools Profiles for Lync. A great tool for changing between Lync accounts when testing or troubleshooting: http://gallery.technet.microsoft.com/office/Profiles-For-Lync-2013-1b193329\nElyza Chat Bot. This chat bot is excellent for demo\u0026rsquo;s or just for playing around: http://gallery.technet.microsoft.com/office/ELYZA-an-auto-responding-4b4e20a1\n","permalink":"https://chrishayward.co.uk/lync-tools-and-add-ons/","summary":"\u003ch2 id=\"troubleshooting-tools\"\u003eTroubleshooting Tools\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eMicrosoft Lync Server 2013 Debugging Tools.\u003c/strong\u003e  Install them on all of your Lync servers.  Download them from here: \u003ca href=\"http://www.microsoft.com/en-gb/download/details.aspx?id=35453\"\u003ehttp://www.microsoft.com/en-gb/download/details.aspx?id=35453\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eWireshark.\u003c/strong\u003e  Install on all of your Lync servers to capture network packets.  Top tips, use filter \u0026ldquo;sip\u0026rdquo; to view all SIP packets being sent and received.  You can also point your Gateways syslog to your server running Wireshark and filter on \u0026ldquo;SYSLOG\u0026rdquo;.  You can Download from here: \u003ca href=\"http://www.wireshark.org/\"\u003ehttp://www.wireshark.org/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eMicrosoft Port Query Tool with custom Lync XML\u003c/strong\u003e.  Install on all Lync servers to check correct network ports are open.  See my post here: \u003ca href=\"http://weakestlync.com/2013/10/25/lync-port-query-tool/\"\u003ehttp://weakestlync.com/2013/10/25/lync-port-query-tool/\u003c/a\u003e\u003c/p\u003e","title":"Lync Tools and Add-Ons"},{"content":"Lync 2013 introduced a new feature called Pool Pairing. Given the scenario below with 2 sites using Lync Standard Edition with paired pools, in the event that Front End 01 was to fail, or Site 1 failed completely all users will automatically register to Front End 02. However they will receive an error in their Lync client \u0026ldquo;Limited Functionality due to Outage\u0026rdquo;, lose their buddy lists, presence information, conferencing features and any Response Groups that were homed on FE01. They will still be able to make inbound and outbound PSTN calls (assuming you have resilient Voice Routing) and they will still be able to search contacts to make P2P audio and video calls. To restore full functionality you need to manually failover the pool following the procedure here: http://technet.microsoft.com/en-us/library/jj204678.aspx\nRemembering or finding the various commands to run in a disaster scenario wastes valuable restore time so I have created a script to do all the hard work for you. The script can also fail back a pool once it is back in service. This script relies on my Lync Backup script to restore Response Groups here (I save these on the standby server if Active/Passive): http://weakestlync.com/2013/07/07/lync-2013-automated-backup-script/\nSimple Lync Standard Edition Pool Pair topology:\nLimited functionality error in Lync 2013 client:\nThe script is menu driven, the splash screen will show the script configuration, it is important to review all of this information before running:\nFrom the main menu you have various options.\nOptions:\na – failover pool01 to pool02 b – failover pool01\u0026rsquo;s response groups to pool02 c – fail back pool01\u0026rsquo;s users to pool01 d – fail back pool01\u0026rsquo;s response groups to pool01 i – view manual DNS changes required during failover j – shows pool state – Use to check if a pool is currently in a failover state k – shows CMS status – Check replication is working and which server is master l – view failed over response group status for both pools – Use to check if any Response Groups have been failed over m – view backup service status for both pools – Use to check that the backup service is working OK z – enable advanced mode (show failover options for both pools and CMS) – Use if you want to failover Pool02 to Pool01 or manually move CMS Option z:\nHere is the script, you need to modify the Script Configuration at the top to reflect your environment.:\n**Use this script at your own risk. I have not programmed Lync Enterprise Edition but it could easily be modified to failover an Enterprise Pool.\n**\n# Author: Created by Weakest Lync, www.WeakestLync.com # Purpose: Script to failover Lync 2013 Standard Edition Pool Pair and Response Groups in a DR scenario # Version: 1.0 # Changes: DATE - Change # 22/01/2014 - Release 1.0 # Script Configuration $CustomerName = \u0026#34;Weakest Lync\u0026#34; # Customer Name $PrimaryFE = \u0026#34;frontend01.WeakestLync.com\u0026#34; # Primary Lync Front End Pool $PrimaryEd = \u0026#34;edge01.WeakestLync.com\u0026#34; # Primary Lync Edge Pool $SecondaryFE = \u0026#34;frontend02.WeakestLync.com\u0026#34; # Secondary Lync Front End Pool $SecondaryEd = \u0026#34;edge02.WeakestLync.com\u0026#34; # Secondary Lync Edge Pool $BackupPath = \u0026#34;C:LyncBackupsBackups\u0026#34; # Backup Path - Uses Lync Automated Backup script to restore Response Groups: http://weakestlync.com/2013/07/07/lync-2013-automated-backup-script/ $ActivePassive = \u0026#34;Yes\u0026#34; # yes/no. Is the Secondary Pool used for failover only? This will hide menu options to failover the Secondary Pool. $RGSRestorePath = \u0026#34;c:Temp\u0026#34; # Temp folder Function WindowColour { $a = (Get-Host).UI.RawUI $a.BackgroundColor = \u0026#34;DarkBlue\u0026#34; } Function FailoverDR ($Pool, $BackupPool, $Edge){ cls MainHeader # Prompt user to confirm Write-Host \u0026#34;You are about to initiate a pool failover from \u0026#34; -NoNewline Write-Host $Pool -ForegroundColor Green -NoNewline Write-Host \u0026#34; to \u0026#34; -NoNewline Write-Host $BackupPool -ForegroundColor Green Write-Host \u0026#34;\u0026#34; $confirm = Read-Host \u0026#34;Please type YES to confirm\u0026#34; If ($confirm -ne \u0026#34;YES\u0026#34;){ MainMenu } # Check that CMS is on Secondary server $LyncCMS = Get-CsManagementStoreReplicationStatus -CentralManagementStoreStatus If ($LyncCMS.ActiveMasterFqdn -ne $BackupPool){ Write-Warning \u0026#34;CMS is not on Secondary server, running CMS failover command\u0026#34; Invoke-CsManagementServerFailover -BackupSqlServerFqdn $BackupPool -BackupSqlInstanceName RTC -Force } # Change Primary Edge next hop to Secondary Front End Set-CsEdgeServer -Identity $Edge -Registrar Registrar:$BackupPool # Failover pool Invoke-CsPoolFailOver -PoolFqdn $Pool -DisasterMode -Confirm:$false ReturnToMenu } Function FailbackDR ($Pool, $BackupPool, $Edge){ cls MainHeader # Prompt user to confirm Write-Host \u0026#34;You are about to initiate a pool failback from \u0026#34; -NoNewline Write-Host $BackupPool -ForegroundColor Green -NoNewline Write-Host \u0026#34; to \u0026#34; -NoNewline Write-Host $Pool -ForegroundColor Green Write-Host \u0026#34;\u0026#34; $confirm = Read-Host \u0026#34;Please type YES to confirm\u0026#34; If ($confirm -ne \u0026#34;YES\u0026#34;){ MainMenu } # Start CMS Replication Invoke-CsManagementStoreReplication -ReplicaFqdn $Pool # Change Primary Edge next hop to Primary Front End Set-CsEdgeServer -Identity $Edge -Registrar Registrar:$Pool # Failback pool Invoke-CsPoolFailBack –PoolFqdn $Pool -Confirm:$false ReturnToMenu } Function FailoverRGS ($Pool, $BackupPool){ cls MainHeader # Prompt user to confirm Write-Host \u0026#34;You are about to initiate a Response Group failover from \u0026#34; -NoNewline Write-Host $Pool -ForegroundColor Green -NoNewline Write-Host \u0026#34; to \u0026#34; -NoNewline Write-Host $BackupPool -ForegroundColor Green Write-Host \u0026#34;\u0026#34; $confirm = Read-Host \u0026#34;Please type YES to confirm\u0026#34; If ($confirm -ne \u0026#34;YES\u0026#34;){ MainMenu } # Get the latest RGS Backup file $LatestBackup = Get-ChildItem -Directory $BackupPath | Sort CreationTime -Descending | select -First 1 $RGSBackupPath = $LatestBackup.FullName + \u0026#34;Lync-RGS-Config_$Pool.zip\u0026#34; # Test RGS Backup file exists If(!(Test-Path $RGSBackupPath)){ Write-Warning \u0026#34;No RGS Backup File\u0026#34; Write-Warning \u0026#34;Ensure that an RGS backup is located in the following location $RGSBackupPath\u0026#34; ReturnToMenu } # Import Response Group config to secondary pool Import-CsRgsConfiguration -Destination \u0026#34;service:ApplicationServer:$BackupPool\u0026#34; -FileName $RGSBackupPath -ReplaceExistingRgsSettings -Force ReturnToMenu } Function FailbackRGS ($Pool, $BackupPool){ cls MainHeader # Prompt user to confirm Write-Host \u0026#34;You are about to initiate a Response Group failback from \u0026#34; -NoNewline Write-Host $BackupPool -ForegroundColor Green -NoNewline Write-Host \u0026#34; to \u0026#34; -NoNewline Write-Host $Pool -ForegroundColor Green Write-Host \u0026#34;\u0026#34; $confirm = Read-Host \u0026#34;Please type YES to confirm\u0026#34; If ($confirm -ne \u0026#34;YES\u0026#34;){ MainMenu } # Check temp path exists If(!(Test-Path $RGSRestorePath)){ New-Item -ItemType directory -Path $RGSRestorePath } # Temp export file name $RGSRestoreFile = $RGSRestorePath + \u0026#34;RGSExportPrimaryPoolRestore.zip\u0026#34; # If we already have a temp export file, delete it. If(Test-Path $RGSRestoreFile){ Remove-Item $RGSRestoreFile } # Export Response Groups from Secondary pool that are owned by the Primary, then remove them. Export-CsRgsConfiguration –Source \u0026#34;service:ApplicationServer:$BackupPool\u0026#34; –Owner \u0026#34;service:ApplicationServer:$Pool\u0026#34; –Filename $RGSRestoreFile -RemoveExportedConfiguration -Force # Import Response Groups owned by the Primary pool back in to the Primary. Import-CsRgsConfiguration –Destination \u0026#34;service:ApplicationServer:$Pool\u0026#34; –OverwriteOwner –Filename $RGSRestoreFile -Force ReturnToMenu } Function MoveCMS($BackupPool){ cls MainHeader # Prompt user to confirm Write-Host \u0026#34;You are about to move the Active CMS to \u0026#34; -NoNewline Write-Host $BackupPool -ForegroundColor Green Write-Host \u0026#34;\u0026#34; $confirm = Read-Host \u0026#34;Please type YES to confirm\u0026#34; If ($confirm -ne \u0026#34;YES\u0026#34;){ MainMenu } $LyncCMS = Get-CsManagementStoreReplicationStatus -CentralManagementStoreStatus If ($LyncCMS.ActiveMasterFqdn -ne $BackupPool){ Write-Warning \u0026#34;Server is not CMS Active Master, running CMS failover command\u0026#34; Invoke-CsManagementServerFailover -BackupSqlServerFqdn $BackupPool -BackupSqlInstanceName RTC -Force Write-Host \u0026#34;CMS Active Master moved to $BackupPool\u0026#34; } Else{ Write-Host \u0026#34;CMS Active Master is already on $BackupPool\u0026#34; } ReturnToMenu } Function ManualChanges { cls MainHeader Write-Host \u0026#34;DNS Changes during Failover:\u0026#34; Write-Host \u0026#34;* Point lyncdiscover.sipdomain DNS record to Secondary Pool Web Services\u0026#34; Write-Host \u0026#34;* Point dialin.sipdomain DNS record to point to Secondary Pool Web Services\u0026#34; Write-Host \u0026#34;* Point meet.sipdomain DNS record to point to Secondary Pool Web Services\u0026#34; Write-Host \u0026#34;\u0026#34; Write-Host \u0026#34;DNS Changes during Failback:\u0026#34; Write-Host \u0026#34;* Point lyncdiscover.sipdomain DNS record to Primary Pool Web Services\u0026#34; Write-Host \u0026#34;* Point dialin.sipdomain DNS record to point to Primary Pool Web Services\u0026#34; Write-Host \u0026#34;* Point meet.sipdomain DNS record to point to Primary Pool Web Services\u0026#34; Write-Host \u0026#34;\u0026#34; ReturnToMenu } Function FailoverStatus{ cls MainHeader Get-CsRegistrarConfiguration | Select-Object Identity, PoolState | Format-Table ReturnToMenu } Function CMSStatus{ cls MainHeader Get-CsManagementStoreReplicationStatus Read-Host \u0026#34;Press any key to view more details\u0026#34; Get-CsManagementStoreReplicationStatus -CentralManagementStoreStatus ReturnToMenu } Function RGSStatus{ cls MainHeader Read-Host \u0026#34;Press any key to view RGS Workflows in $SecondaryFE owned by $PrimaryFE\u0026#34; Get-CsRgsWorkflow -Identity \u0026#34;service:ApplicationServer:$SecondaryFE\u0026#34; -Owner \u0026#34;service:ApplicationServer:$PrimaryFE\u0026#34; | Select-Object OwnerPool, Name, LineUri | Format-Table Read-Host \u0026#34;Press any key to view RGS Workflows in $PrimaryFE owned by $SecondaryFE\u0026#34; Get-CsRgsWorkflow -Identity \u0026#34;service:ApplicationServer:$PrimaryFE\u0026#34; -Owner \u0026#34;service:ApplicationServer:$SecondaryFE\u0026#34; | Select-Object OwnerPool, Name, LineUri | Format-Table ReturnToMenu } Function BackupServiceStatus{ cls MainHeader Read-Host \u0026#34;Press any key to view the Backup Service status for $PrimaryFE\u0026#34; Get-CsBackupServiceStatus -PoolFqdn $PrimaryFE | Format-List Read-Host \u0026#34;Press any key to view the Backup Service status for $SecondaryFE\u0026#34; Get-CsBackupServiceStatus -PoolFqdn $SecondaryFE | Format-List ReturnToMenu } Function AdvancedMode{ # Forces script to show failover options for both pools $ActivePassive = \u0026#34;no\u0026#34; # Show advanced options on the menu $AdvancedMode = \u0026#34;Yes\u0026#34; MainMenu } Function ReturnToMenu{ Read-Host \u0026#34;Press any key to return to main menu\u0026#34; MainMenu } Function MainHeader{ cls Write-Host \u0026#34; *** Lync 2013 Standard Edition Failover Script ***\u0026#34; -Foregroundcolor Magenta Write-Host \u0026#34;\u0026#34; } Function JustExit{ cls exit } Function MainMenu ($blank){ Get-Variable true | Out-Default; Clear-Host; # Required due to PowerShell cls bug not clearing display MainHeader # Menu Write-Host \u0026#34;Primary Pool Disaster Recovery: \u0026#34; -NoNewline -ForegroundColor Yello Write-Host $PrimaryFE -ForegroundColor Green Write-Host \u0026#34;a. Disaster - Failover Pool + CMS\u0026#34; Write-Host \u0026#34;b. Disaster - Failover Response Groups\u0026#34; Write-Host \u0026#34;c. Recovery - Failback Pool\u0026#34; Write-Host \u0026#34;d. Recovery - Failback Response Groups\u0026#34; If ($ActivePassive -eq \u0026#34;no\u0026#34;){ Write-Host \u0026#34;Secondary Pool Disaster Recovery: \u0026#34; -NoNewline -ForegroundColor Yellow Write-Host $SecondaryFE -ForegroundColor Green Write-Host \u0026#34;e. Disaster - Failover Pool + CMS\u0026#34; Write-Host \u0026#34;f. Disaster - Failover Response Groups\u0026#34; Write-Host \u0026#34;g. Recovery - Failback Pool\u0026#34; Write-Host \u0026#34;h. Recovery - Failback Response Groups\u0026#34; } Write-Host \u0026#34;Administration: \u0026#34;-ForegroundColor Yellow Write-Host \u0026#34;i. View manual changes required during failover/failback\u0026#34; Write-Host \u0026#34;j. View Registrar failover status\u0026#34; Write-Host \u0026#34;k. View Central Management Store status\u0026#34; Write-Host \u0026#34;l. View failed over Response Group status\u0026#34; Write-Host \u0026#34;m. View Backup Service status\u0026#34; If ($AdvancedMode -eq \u0026#34;Yes\u0026#34;){ Write-Host \u0026#34;CMS Management: \u0026#34;-ForegroundColor Yellow Write-Host \u0026#34;n. Move CMS to Primary Pool\u0026#34; Write-Host \u0026#34;o. Move CMS to Secondary Pool\u0026#34; } else{ Write-Host \u0026#34;z. Advanced Mode\u0026#34; } Write-Host \u0026#34;q. Exit Script (q, exit, quit)\u0026#34; Write-Host \u0026#34;\u0026#34; If ($blank -eq \u0026#34;1\u0026#34;){ Write-Warning \u0026#34;Invalid selection\u0026#34; } $a = Read-Host \u0026#34;Select an option (e.g. q)\u0026#34; switch ($a){ a {FailoverDR -Pool $PrimaryFE -BackupPool $SecondaryFE -Edge $PrimaryEd} b {FailoverRGS -Pool $PrimaryFE -BackupPool $SecondaryFE} c {FailbackDR -Pool $PrimaryFE -BackupPool $SecondaryFE -Edge $PrimaryEd} d {FailbackRGS -Pool $PrimaryFE -BackupPool $SecondaryFE} e {FailoverDR -Pool $SecondaryFE -BackupPool $PrimaryFE -Edge $SecondaryEd} f {FailoverRGS -Pool $SecondaryFE -BackupPool $PrimaryFE} g {FailbackDR -Pool $SecondaryFE -BackupPool $PrimaryFE -Edge $SecondaryEd} h {FailbackRGS -Pool $SecondaryFE -BackupPool $PrimaryFE} i {ManualChanges} J {FailoverStatus} k {CMSStatus} l {RGSStatus} m {BackupServiceStatus} n {MoveCMS -BackupPool $PrimaryFE} o {MoveCMS -BackupPool $SecondaryFE} q {JustExit} z {AdvancedMode} exit {JustExit} quit {JustExit} default {MainMenu -blank \u0026#34;1\u0026#34;} } } Function SplashScreen{ MainHeader Write-Host \u0026#34;* This script can be used to failover a Lync Standard Edition Pool Pair.\u0026#34; Write-Host \u0026#34;* Make sure you are running this script as Administrator (Lync Management Shell \u0026gt; Run As Administrator).\u0026#34; Write-Host \u0026#34;* Your account must be a member of the RTCUniversalServerAdmins and CsAdministrator groups.\u0026#34; Write-Host \u0026#34;\u0026#34; Write-Host \u0026#34;* Customer Platform is \u0026#34; -NoNewline Write-Host $CustomerName -ForegroundColor Green Write-Host \u0026#34;* Primary Front End is \u0026#34; -NoNewline Write-Host $PrimaryFE -ForegroundColor Green Write-Host \u0026#34;* Primary Edge is \u0026#34; -NoNewline Write-Host $PrimaryEd -ForegroundColor Green Write-Host \u0026#34;* Secondary Front End is \u0026#34; -NoNewline Write-Host $SecondaryFE -ForegroundColor Green Write-Host \u0026#34;* Secondary Edge is \u0026#34; -NoNewLine Write-Host $SecondaryEd -ForegroundColor Green Write-Host \u0026#34;* Backup path (For RGS failover) is \u0026#34; -NoNewLine Write-Host $BackupPath -ForegroundColor Green Write-Host \u0026#34;* Is Pool Pair Active/Passive? (Secondary Pool is standby only) \u0026#34; -NoNewLine Write-Host $ActivePassive -ForegroundColor Green Write-Host \u0026#34;\u0026#34; Write-Host \u0026#34;Please review the details above, amend the script config if required.\u0026#34; Write-Host \u0026#34;\u0026#34; Read-Host \u0026#34;Press any key to load menu\u0026#34; MainMenu } WindowColour SplashScreen ","permalink":"https://chrishayward.co.uk/2014/01/22/lync-2013-standard-edition-pool-pair-failover-script/","summary":"\u003cp\u003eLync 2013 introduced a new feature called Pool Pairing. Given the scenario below with 2 sites using Lync Standard Edition with paired pools, in the event that Front End 01 was to fail, or Site 1 failed completely all users will automatically register to Front End 02. However they will receive an error in their Lync client \u0026ldquo;Limited Functionality due to Outage\u0026rdquo;, lose their buddy lists, presence information, conferencing features and any Response Groups that were homed on FE01. They will still be able to make inbound and outbound PSTN calls (assuming you have resilient Voice Routing) and they will still be able to search contacts to make P2P audio and video calls. To restore full functionality you need to manually failover the pool following the procedure here: \u003ca href=\"http://technet.microsoft.com/en-us/library/jj204678.aspx\"\u003ehttp://technet.microsoft.com/en-us/library/jj204678.aspx\u003c/a\u003e\u003c/p\u003e","title":"Lync 2013 – Standard Edition Pool Pair Failover Script"},{"content":"You need to restart all Lync services, open services.msc and see 10+ Lync Server services. Rather than go through each one hitting the stop or restart button with your mouse you can use PowerShell!\nStop all Lync Services:\nStop-CsWindowsService Start all Lync Services:\nStart-CsWindowsService ","permalink":"https://chrishayward.co.uk/2014/01/10/lync-tip-quickly-restart-all-lync-services-using-powershell/","summary":"\u003cp\u003eYou need to restart all Lync services, open services.msc and see 10+ Lync Server services.  Rather than go through each one hitting the stop or restart button with your mouse you can use PowerShell!\u003c/p\u003e\n\u003cp\u003eStop all Lync Services:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-powershell\" data-lang=\"powershell\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eStop-CsWindowsService\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eStart all Lync Services:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-powershell\" data-lang=\"powershell\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eStart-CsWindowsService\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"Lync Tip: Quickly restart all Lync services using PowerShell"},{"content":"So you need to calculate how much bandwidth Lync will use, you launch google and type \u0026ldquo;Lync bandwidth requirements\u0026rdquo;. You click the top link for Microsoft Downloads \u0026ldquo;Lync 2010 and 2013 Bandwidth Calculator\u0026rdquo; here http://windowspbx.blogspot.co.uk/2012/01/simple-smb-lync-bandwidth-calculator.html. You download the zip, open the excel file then realise you don\u0026rsquo;t have a degree in quantum physics or it\u0026rsquo;s Friday and you just want some quick figures to work with.\nBehold Matt Landis\u0026rsquo; \u0026ldquo;Very Simple SMB Lync Bandwidth Calculator\u0026rdquo; here: http://windowspbx.blogspot.co.uk/2012/01/simple-smb-lync-bandwidth-calculator.html\nObviously it\u0026rsquo;s not as detailed or accurate as the Microsoft calculator but good to find a ball park figure for one branch office.\n","permalink":"https://chrishayward.co.uk/2014/01/10/lync-bandwidth-requirements-simple-calculator/","summary":"\u003cp\u003eSo you need to calculate how much bandwidth Lync will use, you launch google and type \u0026ldquo;Lync bandwidth requirements\u0026rdquo;.  You click the top link for Microsoft Downloads \u0026ldquo;Lync 2010 and 2013 Bandwidth Calculator\u0026rdquo; here \u003ca href=\"http://windowspbx.blogspot.co.uk/2012/01/simple-smb-lync-bandwidth-calculator.html\"\u003ehttp://windowspbx.blogspot.co.uk/2012/01/simple-smb-lync-bandwidth-calculator.html\u003c/a\u003e.  You download the zip, open the excel file then realise you don\u0026rsquo;t have a degree in quantum physics or it\u0026rsquo;s Friday and you just want some quick figures to work with.\u003c/p\u003e\n\u003cp\u003eBehold Matt Landis\u0026rsquo; \u0026ldquo;Very Simple SMB Lync Bandwidth Calculator\u0026rdquo; here: \u003ca href=\"http://windowspbx.blogspot.co.uk/2012/01/simple-smb-lync-bandwidth-calculator.html\"\u003ehttp://windowspbx.blogspot.co.uk/2012/01/simple-smb-lync-bandwidth-calculator.html\u003c/a\u003e\u003c/p\u003e","title":"Lync Tip: Bandwidth Requirements Simple Calculator"},{"content":"Struggling with Telnet/Microsoft Port Query Tool to test the correct firewall ports are open between Lync servers?\nI almost started making my own tool/script but this guy has done the hard work for me!\nhttp://flinchbot.wordpress.com/2013/05/10/portqueryui-config-xml-file-for-lync/\nReally useful.\n","permalink":"https://chrishayward.co.uk/2013/10/25/lync-port-query-tool/","summary":"\u003cp\u003eStruggling with Telnet/Microsoft Port Query Tool to test the correct firewall ports are open between Lync servers?\u003c/p\u003e\n\u003cp\u003eI almost started making my own tool/script but this guy has done the hard work for me!\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://flinchbot.wordpress.com/2013/05/10/portqueryui-config-xml-file-for-lync/\"\u003ehttp://flinchbot.wordpress.com/2013/05/10/portqueryui-config-xml-file-for-lync/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eReally useful.\u003c/p\u003e","title":"Lync Tip: Port Query Tool"},{"content":"The scenario is you have created a Response Group (IVR) with an option to call an Out Of Hours engineer. You configure a queue overflow to forward straight to a mobile telephone number outside of your organisation as follows:\nThe out of hours engineer changes on a rota and you want staff to be able to change the queue overflow number without giving them having to access the Lync Control Panel. I have created a PowerShell script that allows users to accomplish this. They can select from a list of names in the menu or manually type a number. Any changes are logged to a text file.\nHere is the script:\n# Author: Created by Weakest Lync, www.WeakestLync.com # Purpose: Script to Change Queue Overflow Number # Version: 1.0 # Changes: DATE - Change # 12/07/2013 - Release 1.0 # Script Config Import-Module Lync $team = \u0026#34;ICT Service Desk\u0026#34; #Team script is used for $queue = \u0026#34;ICT Service Desk\u0026#34; #Lync Queue Name $sipdomain = \u0026#34;@Domain.com\u0026#34; #Lync Sip Domain $lyncpool = \u0026#34;Service:ApplicationServer:LyncFE01.domain.local\u0026#34; #Lync front end pool identity $logfile = \u0026#34;\\fileservershareLynclog.txt\u0026#34; # Menu cls Write-Host \u0026#34;* Change\u0026#34; $team \u0026#34;On Call Number *\u0026#34; -ForegroundColor Cyan Write-Host \u0026#34; \u0026#34; Write-Host \u0026#34;Change the\u0026#34; $team \u0026#34;On Call number to:\u0026#34; Write-Host \u0026#34; \u0026#34; Write-Host \u0026#34;1. User1\u0026#34; -foregroundcolor Yellow Write-Host \u0026#34;2. User2\u0026#34; -foregroundcolor Yellow Write-Host \u0026#34;3. User3\u0026#34; -foregroundcolor Yellow Write-Host \u0026#34;4. User4\u0026#34; -foregroundcolor Yellow Write-Host \u0026#34;5. User5\u0026#34; -foregroundcolor Yellow Write-Host \u0026#34;6. Other\u0026#34; -foregroundcolor Yellow Write-Host \u0026#34; \u0026#34; $a = Read-Host \u0026#34;Select 1-6: \u0026#34; Write-Host \u0026#34; \u0026#34; # Logic to set sip URI based on menu selection switch ($a) { 1 { $forwardname = \u0026#34;User1\u0026#34; $forwardto = \u0026#34;+447123456781\u0026#34; } 2 { $forwardname = \u0026#34;User2\u0026#34; $forwardto = \u0026#34;+447123456782\u0026#34; } 3 { $forwardname = \u0026#34;User3\u0026#34; $forwardto = \u0026#34;+447123456783\u0026#34; } 4 { $forwardname = \u0026#34;User4\u0026#34; $forwardto = \u0026#34;+447123456784\u0026#34; } 5 { $forwardname = \u0026#34;User5\u0026#34; $forwardto = \u0026#34;+447123456785\u0026#34; } 6 { # Other Write-Host \u0026#34;Enter phone number in E.164 format e.g.: \u0026#34; -NoNewLine Write-Host \u0026#34;+44123456789\u0026#34; -ForegroundColor Magenta $forwardto = Read-Host \u0026#34;Phone Number\u0026#34; } } # Code to put E.164 phone numbers into sip format $forwardto = \u0026#34;sip:\u0026#34; + $forwardto $forwardto = $forwardto + $sipdomain # Code to change on call number in Lync $x = Get-CsRgsQueue -Identity $lyncpool -Name $queue $x.OverflowAction = New-CsRgsCallAction -Action TransferToPstn -Uri $forwardto Set-CsRgsQueue -Instance $x # Write to log file $date = Get-Date Write-output \u0026#34;$date, $team, $forwardname, $forwardto\u0026#34; | Out-File -append $logfile Write-Host \u0026#34;On call number changed to: \u0026#34; -NoNewline Write-Host $forwardname \u0026#34;-\u0026#34; $forwardto -ForegroundColor Green Write-Host \u0026#34; \u0026#34; Users need to be a member of CSResponseGroupAdministrator and have the Lync Admin Tools installed. However, in my environment I have created a service account and used psexec to publish the script via Citrix (The Citrix server has the Lync Admin Tools installed).\nc:\\scripts\\psexec.exe -e -u domain\\RGSSVCAccount -p password C:\\Windows\\System32\\Windows\\PowerShellv1.0\\powershell.exe -noexit \u0026ldquo;C:\\Scripts\\LyncScripts\\Lync_QueueOverflow.ps1\u0026rdquo;\n","permalink":"https://chrishayward.co.uk/2013/07/12/lync-change-queue-overflow-number-with-powershell-script/","summary":"\u003cp\u003eThe scenario is you have created a Response Group (IVR) with an option to call an Out Of Hours engineer.  You configure a queue overflow to forward straight to a mobile telephone number outside of your organisation as follows:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/wp-content/uploads/2013/07/queue_overflow.jpg\"\u003e\u003cimg alt=\"Queue_Overflow\" loading=\"lazy\" src=\"/wp-content/uploads/2013/07/queue_overflow.jpg\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eThe out of hours engineer changes on a rota and you want staff to be able to change the queue overflow number without giving them having to access the Lync Control Panel.  I have created a PowerShell script that allows users to accomplish this.  They can select from a list of names in the menu or manually type a number.  Any changes are logged to a text file.\u003c/p\u003e","title":"Lync – Change queue overflow number with PowerShell Script"},{"content":"I needed a method to recharge departments call costs from Microsoft Lync and came across the following article by Frederik Lefevre:\nhttp://www.ucprofessional.com/2012/01/lync-cdr-report.html\nI found this was exactly what I required but unfortunately the SQL views were not compatible with Lync 2013. This is a simple guide on how to get this working on Lync 2013 for call costs in the UK:\n**SQL Database Configuration\n**\nOn the Lync Monitoring and Archiving SQL instance, create a Linked Server named \u0026ldquo;ADSI\u0026rdquo; with the following settings:\nConfigure Security so connections will be made using the security context: Enter an LDAP lookup service accounts credentials.\nOnce complete, right click ADSI and click \u0026ldquo;Test Connection\u0026rdquo;\nCreate a new database named LyncBilling on the same instance as your Lync LcsCDR database.\n**Create a view named \u0026ldquo;LyncEVUsers\u0026rdquo; (change domain name to suit your environment)\n**\nSELECT displayName AS Displayname, department AS Department, [msRTCSIP-PrimaryUserAddress] COLLATE Latin1_General_CI_AI AS SipAddress FROM OPENQUERY(ADSI, \u0026#39;SELECT displayName, msRTCSIP-PrimaryUserAddress, department FROM \u0026#39;\u0026#39;LDAP://DC=domain,DC=local\u0026#39;\u0026#39;WHERE objectClass = \u0026#39;\u0026#39;user\u0026#39;\u0026#39; AND msRTCSIP-OptionFlags = 385 \u0026#39;) AS derivedtbl_1 Create a view named \u0026ldquo;OutgoingCallsUK\u0026rdquo;\nSELECT TOP (100) PERCENT SessionDetails.FromUri, SessionDetails.ToUri, SessionDetails.InviteTime, SessionDetails.ResponseTime, SessionDetails.EndTime, CASE WHEN LEFT(ToUri, 4) = \u0026#39;+441\u0026#39; THEN \u0026#39;National\u0026#39; WHEN LEFT(ToUri, 4) = \u0026#39;+442\u0026#39; THEN \u0026#39;National\u0026#39; WHEN LEFT(ToUri, 4) = \u0026#39;+443\u0026#39; THEN \u0026#39;National\u0026#39; WHEN LEFT(ToUri, 2) = \u0026#39;01\u0026#39; THEN \u0026#39;National\u0026#39; WHEN LEFT(ToUri, 2) = \u0026#39;02\u0026#39; THEN \u0026#39;National\u0026#39; WHEN LEFT(ToUri, 2) = \u0026#39;03\u0026#39; THEN \u0026#39;National\u0026#39; WHEN LEFT(ToUri, 4) = \u0026#39;+447\u0026#39; THEN \u0026#39;Mobile\u0026#39; WHEN LEFT(ToUri, 2) = \u0026#39;07\u0026#39; THEN \u0026#39;Mobile\u0026#39; WHEN LEFT(ToUri, 4) = \u0026#39;+448\u0026#39; THEN \u0026#39;Special\u0026#39; WHEN LEFT(ToUri, 2) = \u0026#39;08\u0026#39; THEN \u0026#39;Special\u0026#39; WHEN LEFT(ToUri, 4) = \u0026#39;+449\u0026#39; THEN \u0026#39;Premium\u0026#39; WHEN LEFT(ToUri, 2) = \u0026#39;09\u0026#39; THEN \u0026#39;Premium\u0026#39; WHEN LEFT(ToUri, 3) \u0026lt;\u0026gt; \u0026#39;+44\u0026#39; THEN \u0026#39;International\u0026#39; END AS Tariff, LcsCDR.dbo.Gateways.Gateway, dbo.LyncEVUsers.Displayname, dbo.LyncEVUsers.Department, DATEDIFF(ss, SessionDetails.ResponseTime, SessionDetails.EndTime) AS Duration FROM LcsCDR.dbo.SessionDetailsView AS SessionDetails INNER JOIN LcsCDR.dbo.VoipDetails ON SessionDetails.SessionIdTime = LcsCDR.dbo.VoipDetails.SessionIdTime INNER JOIN LcsCDR.dbo.Gateways ON LcsCDR.dbo.VoipDetails.ToGatewayId = LcsCDR.dbo.Gateways.GatewayId RIGHT OUTER JOIN dbo.LyncEVUsers ON \u0026#39;sip:\u0026#39; + SessionDetails.FromUri = dbo.LyncEVUsers.SipAddress WHERE (SessionDetails.MediaTypes = 16) AND (SessionDetails.FromUriType = N\u0026#39;UserUri\u0026#39;) AND (SessionDetails.ToUriType = N\u0026#39;PhoneUri\u0026#39;) AND (SessionDetails.ResponseCode = 200) ORDER BY SessionDetails.InviteTime You should now have two views created in the LyncBilling database.\n**Create a report in Microsoft Excel:\n**\nCreate a new Data Connection in Excel: Data \u0026gt; From Other Sources \u0026gt; From SQL Server\nEnter SQL server name and instance and provide credentials:\nSelect the \u0026ldquo;LyncBilling\u0026rdquo; database and the \u0026ldquo;OutgoingCallsUK\u0026rdquo; table:\nClick Finish.\nClick OK on the Import Data window.\nThe billing data should import into Excel:\nRename Sheet1 to \u0026ldquo;Data\u0026rdquo;\nRename Sheet2 to \u0026ldquo;Tariffs\u0026rdquo; and populate the following rates:\nCreate two new columns in the Data sheet, \u0026ldquo;TotalCost\u0026rdquo; and \u0026ldquo;Month\u0026rdquo;\nFormula for TotalCost:\n=IF(F2=\u0026#34;Mobile\u0026#34;,(J2/60)*Tariffs!$B$1,IF(F2=\u0026#34;International\u0026#34;,(J2/60)*Tariffs!$B$2,IF(F2=\u0026#34;National\u0026#34;,(J2/60)*Tariffs!$B$3,IF(F2=\u0026#34;Special\u0026#34;,(J2/60)*Tariffs!$B$4,IF(F2=\u0026#34;Premium\u0026#34;,(J2/60)*Tariffs!$B$5))))) Format TotalCost as currency\nFormula for Month:\n=TEXT(C2,\u0026#34;mmmYY\u0026#34;) The Data sheet should now look like this:\nClick in the top left corner of the Data sheet to highlight all cells.\nClick \u0026ldquo;Insert\u0026rdquo; \u0026gt; \u0026ldquo;Pivot Table\u0026rdquo;\nConfigure the Pivot Table fields as follows:\nRight click the Count of TotalCost field and select \u0026ldquo;Value Field Settings\u0026rdquo;. Select \u0026ldquo;Sum\u0026rdquo; and change the number format to currency. Rename the Pivot Table sheet to \u0026ldquo;Report\u0026rdquo;\nYou can now use the Pivot Table filters to find out call costs for Departments based on a particular Gateway and Month.\nTo refresh the data click \u0026ldquo;Data\u0026rdquo; \u0026gt; \u0026ldquo;Refresh\u0026rdquo; on the Data sheet, then repeat on the Report sheet:\n","permalink":"https://chrishayward.co.uk/2013/07/11/lync-2013-cdr-report-recharge-call-costs/","summary":"\u003cp\u003eI needed a method to recharge departments call costs from Microsoft Lync and came across the following article by Frederik Lefevre:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://www.ucprofessional.com/2012/01/lync-cdr-report.html\"\u003ehttp://www.ucprofessional.com/2012/01/lync-cdr-report.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eI found this was exactly what I required but unfortunately the SQL views were not compatible with Lync 2013. This is a simple guide on how to get this working on Lync 2013 for call costs in the UK:\u003c/p\u003e\n\u003cp\u003e**SQL Database Configuration\u003cbr\u003e\n**\u003c/p\u003e\n\u003cp\u003eOn the Lync Monitoring and Archiving SQL instance, create a Linked Server named \u0026ldquo;ADSI\u0026rdquo; with the following settings:\u003c/p\u003e","title":"Lync 2013 CDR Report – Recharge Call Costs"},{"content":"This script will backup Lync 2013 core data and settings off all servers in the topology as per Technet article: http://technet.microsoft.com/en-us/library/hh202170.aspx\nThe script does the following:\nBackup the Central Management Store Backup the Location Information Service Data Backup the user data on each Front End pool Backup the Response Group configuration on each Front End pool Backup the Voice Configuration It will create a new folder with a date stamp for each backup. It will also clean up backups older than x days. To use the script:\nCreate a scheduled task on one of your Lync Front End servers to run the backup script, see here. Configure the Backup Path and Backup Retention values. Note I have only tested this on Lync 2013 with two standard edition (pool pair) servers. I have not tested on enterprise pools. You will also need to do a separate SQL backup of Monitoring, Archiving and Persistent Chat databases as well as a file system backup of all File Stores. Use at your own risk.\nUpdate 06-11-2013 - I have fixed the delete old backup directories as I noticed that was not working. Also tested on Lync 2013 Enterprise and seems to work OK :).\n# Author: Created by Weakest Lync, www.WeakestLync.com # Purpose: Script to backup Lync 2013 # Version: 1.1 # Changes: DATE - Change # 08/07/2013 - Release 1.0 # 06/11/2013 - Release 1.1 - Fixed code that deletes old backup directories Import-Module Lync # Script Config $BackupPath = \u0026#34;C:LyncBackupsBackups\u0026#34; # Backup Path $BackupRetention = -14 # Number of days to keep old backups (Requires a \u0026#34;-\u0026#34;, e.g. two weeks would be -14, 5 days would be -5) # *** Start of script *** # Delete old backup directories Get-ChildItem $BackupPath |? {$_.psiscontainer -and $_.lastwritetime -le (get-date).adddays($BackupRetention)} |% {remove-item $_.FullName -recurse -force} # Get date in day-month-year format and set backup path $DateStamp = Get-Date -Format dd-MM-yy $BackupPath = $BackupPath + \u0026#34;LyncBackup_\u0026#34; + $DateStamp +\u0026#34;\u0026#34; New-Item $BackupPath -type directory -force # Backup the Lync Central Management Store $CMSBackupFile = $BackupPath + \u0026#34;Lync-CMS-Config.zip\u0026#34; Export-CsConfiguration -FileName $CMSBackupFile # Backup Location Information Service data $LISBackupFile = $BackupPath + \u0026#34;Lync-LIS-Config.zip\u0026#34; Export-CsLisConfiguration -FileName $LISBackupFile # Backup User Data (Lync 2013 servers only) $UserServer = Get-CsService -UserServer | Where-Object {$_.version -eq 6} ForEach ($Service in $UserServer) { $UserDataBackupFile = $BackupPath + \u0026#34;Lync-User-Config_\u0026#34; + $($Service.PoolFqdn) + \u0026#34;.zip\u0026#34; Export-CsUserData -PoolFQDN $($Service.PoolFqdn) -FileName $UserDataBackupFile } # Backup Response Group Configuration (Lync 2013 servers only) $ApplicationServer = Get-CsService -ApplicationServer | Where-Object {$_.version -eq 6} ForEach ($Service in $ApplicationServer) { $RGSBackupFile = $BackupPath + \u0026#34;Lync-RGS-Config_\u0026#34; + $($Service.PoolFqdn) + \u0026#34;.zip\u0026#34; Export-CsRgsConfiguration -Source ApplicationServer:$($Service.PoolFqdn) -FileName $RGSBackupFile } # Backup Voice Configuration $BackupPath = $BackupPath + \u0026#34;Lync-Voice-Config\u0026#34; New-Item $BackupPath -type directory -force Get-CsDialPlan | Export-Clixml -path $BackupPathDialPlan.xml Get-CsVoicePolicy | Export-Clixml -path $BackupPathVoicePolicy.xml Get-CsVoiceRoute | Export-Clixml -path $BackupPathVoiceRoute.xml Get-CsPstnUsage | Export-Clixml -path $BackupPathPSTNUsage.xml Get-CsVoiceConfiguration | Export-Clixml -path $BackupPathVoiceConfiguration.xml Get-CsTrunkConfiguration | Export-Clixml -path $BackupPathTrunkConfiguration.xml ","permalink":"https://chrishayward.co.uk/2013/07/07/lync-2013-automated-backup-script/","summary":"\u003cp\u003eThis script will backup Lync 2013 core data and settings off all servers in the topology as per Technet article: \u003ca href=\"http://technet.microsoft.com/en-us/library/hh202170.aspx\"\u003ehttp://technet.microsoft.com/en-us/library/hh202170.aspx\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eThe script does the following:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eBackup the Central Management Store\u003c/li\u003e\n\u003cli\u003eBackup the Location Information Service Data\u003c/li\u003e\n\u003cli\u003eBackup the user data on each Front End pool\u003c/li\u003e\n\u003cli\u003eBackup the Response Group configuration on each Front End pool\u003c/li\u003e\n\u003cli\u003eBackup the Voice Configuration\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eIt will create a new folder with a date stamp for each backup.  It will also clean up backups older than x days.  To use the script:\u003c/p\u003e","title":"Lync 2013 – Automated Backup Script"},{"content":"I recently deployed an SBA at a branch office and configured an RGS for the Reception. If the receptionist does not answer within a certain time period then the call is forwarded to an external party.\nWhen calling the reception response group, after the queue timeout period the call would be forwarded to the external party (simple!).\nI came across a problem where my the RGS is hosted on a Lync Front End server in the UK data centre (as SBA does not support RGS). The Front End server has a site Voice Policy configured to route all PSTN calls via the UK gateway. The problem was when the queue timed out, my RGS would forward the call out of a central gateway in the UK rather than the gateway built in to the SBA (in the Netherlands). To resolve this issue I had to assign a User Voice Policy to the Response Group that had the correct PSTN usage, route and trunk to the gateway.\nNote: I already had site and user voice policies configured for my SBA and Gateway (I use http://lyncoptimizer.com/). This tool creates all site voice policies, user voice policies, normalization rules, routes etc. It\u0026rsquo;s really useful!\nFirst step is to use the GetCSApplicationEndPoint command to get the Response Group:\nGet-CsApplicationEndpoint -Filter {DisplayName -Like \u0026#34;NL Office Reception*\u0026#34;} Identity : CN={42b43972-7e20-4720-b5d9-7020d061ef69},CN=Application Contacts,CN=RTC Service,CN=Services,CN=Configuration,DC=domain,DC=local RegistrarPool : lyncfe.domain.local HomeServer : CN=Lc Services,CN=Microsoft,CN=7:1,CN=Pools,CN=RTC Service,CN=Services,CN=Configuration,DC=domain,DC=local OwnerUrn : urn:application:RGS SipAddress : sip:nl.Officereception@domain.com DisplayName : NL Office Reception DisplayNumber : +31101234567 LineURI : tel:+31101234567 PrimaryLanguage : 0 SecondaryLanguages : {} EnterpriseVoiceEnabled : True ExUmEnabled : False Enabled : True Once you have confirmed that this is the right Response Group, assign a voice policy by piping Get-CSApplicationEndpoint in to Grant-CSVoicePolicy.\nGet-CsApplicationEndpoint -Filter {DisplayName -Like \u0026#34;NL Office Reception*\u0026#34;} | Grant-CsVoicePolicy -PolicyName \u0026#34;NL-Rotterdam-10-Office-International\u0026#34; That\u0026rsquo;s it, now when the Response Group forwards a call out to PSTN it will route via the correct PSTN gateway.\nTo remove the voice policy you can run the following:\nGet-CsApplicationEndpoint -Filter {DisplayName -Like \u0026#34;NL Office Reception*\u0026#34;} | Grant-CsVoicePolicy -PolicyName $null ","permalink":"https://chrishayward.co.uk/2013/07/03/lync-response-group-voice-policy/","summary":"\u003cp\u003eI recently deployed an SBA at a branch office and configured an RGS for the Reception. If the receptionist does not answer within a certain time period then the call is forwarded to an external party.\u003c/p\u003e\n\u003cp\u003eWhen calling the reception response group, after the queue timeout period the call would be forwarded to the external party (simple!).\u003c/p\u003e\n\u003cp\u003eI came across a problem where my the RGS is hosted on a Lync Front End server in the UK data centre (as SBA does not support RGS). The Front End server has a site Voice Policy configured to route all PSTN calls via the UK gateway. The problem was when the queue timed out, my RGS would forward the call out of a central gateway in the UK rather than the gateway built in to the SBA (in the Netherlands). To resolve this issue I had to assign a User Voice Policy to the Response Group that had the correct PSTN usage, route and trunk to the gateway.\u003c/p\u003e","title":"Lync – Response Group Voice Policy"},{"content":"When designing your Lync 2013 topology it is easy to overcomplicate the topology with Enterprise Pools in each datacenter. Spanning pools is not supported across metropolitan datacenters in Lync 2013 which means as a minimum recommendation you would require 3 Front End servers in each datacenter pool. Then on top of that you require SQL backend servers, Edge Servers, Reverse Proxies, Office Web App Servers, File Servers, Load Balancers and Persistent Chat servers! Not to mention you require Active Directory, a Certificate Authority and Exchange UM if you want Voicemail!\nWhen designing my first Lync 2013 topology it started to get very big. After some careful consideration I decided to implement 2 Standard Edition Front End servers as a \u0026ldquo;Pool Pair\u0026rdquo; across the Primary and Secondary datacenters. This was due to the Topology being for less than 5000 users as well as the Lync servers being hosted in Tier 3 datacenters on a highly available VMware cluster, SAN storage and Network. The chances of a FE server failure were low and a Standard Edition Pool Pair provides an adequate MTTR if that server was to fail (\u0026lt;30 minutes with Administrator intervention).\nIf one of the servers was to fail in the Pool Pair, users will failover to the other server automatically. Users will receive an error in their Lync Client \u0026ldquo;Limited functionality due to an outage\u0026rdquo; but will still be able to make phone calls and IM. They will lose features like contacts, conferencing and Presence. However with Administrator intervention you can manually failover the pool to the other member of the Pool Pair using the Invoke-CSPoolFailover command. After this is complete, contacts, conferencing and presence are all restored. Here is the Technet article on how to failover a pool: http://technet.microsoft.com/en-gb/library/jj204678.aspx\nEnterprise Voice calls will still work assuming your Voice Routing is configured correctly on your PBX/Gateway. Response Groups also need to be recovered manually during a failover.\nIt is also worth pointing out that you can balance users across both servers in a Pool Pair (e.g. 2500 on one, and 2500 on the other) so the impact is less if a server was to fail. In my environment the server in the secondary data centre is for failover (DR) only. I am currently writing a PowerShell script that will sit on the DR server that can be executed by a System Administrator should the primary Front End fail. This can be used to failover all services to the secondary Front End in a DR scenario. I will post it on here once complete and tested.\nFinally, here is an excellent blog post that explains the advantages of Standard Edition servers in a Pool Pair to provide HA and DR: http://jasonshave.blogspot.co.uk/2012/11/lync-server-2013-ha-design-changes-and.html\n","permalink":"https://chrishayward.co.uk/2013/05/08/lync-2013-high-availability/","summary":"\u003cp\u003eWhen designing your Lync 2013 topology it is easy to overcomplicate the topology with Enterprise Pools in each datacenter.  Spanning pools is not supported across metropolitan datacenters in Lync 2013 which means as a minimum recommendation you would require 3 Front End servers in each datacenter  pool.  Then on top of that you require SQL backend servers, Edge Servers, Reverse Proxies, Office Web App Servers, File Servers, Load Balancers and Persistent Chat servers!  Not to mention you require Active Directory, a Certificate Authority and Exchange UM if you want Voicemail!\u003c/p\u003e","title":"Lync 2013 High Availability"},{"content":"After deploying a Lync 2013 pool alongside an existing Lync 2010 deployment, users were unable to join conferences created by users registered on the 2013 pool. They would get the error \u0026ldquo;Conference Error\u0026rdquo;. This affected users who were moved from the 2010 pool and new users created on the 2013 pool.\nWhen trying to change the Lync meeting options in Outlook or trying to reset the Assigned Conference Information via the Dial-in conference settings page it would generate an error.\nAlso, when calling the dial-in conference number and entering the conference ID you would get the message: \u0026ldquo;Sorry I can\u0026rsquo;t find a meeting with that number, try entering your conference ID again and then press #\u0026rdquo;.\nThe Lync 2013 Front End event logs had the following event:\nLog Name: Lync Server Source: LS MCU Factory Date: 09/04/2013 17:22:32 Event ID: 51048 Task Category: (1021) Level: Error Keywords: Classic User: N/A Computer: fe2013-1.domain.local Description: McuFactory could not find the pool associated with one of the conference directories. Failed to read pool FQDN associated with conference directory 11. Cause: The pool associated with the conference directory does not exist anymore. Resolution: Conference directories without a valid pool associated can be deleted using management tools. To fix, if you run the command \u0026ldquo;Get-CsConferenceDirectory\u0026rdquo; it will return which conference directories are in use.\nGet-CsConferenceDirectory | select Identity,ServiceID -------- --------- 1 UserServer:fe2010.domain.local 11 BackCompatSite-UserServices-1 12 UserServer:fe2013-1.domain.local 13 UserServer:fe2013-2.domain.local As you can see from the output above, there is still a conference directory from the old OCS 2007 R2 environment (BackCompatSite). The BackCompatSite was deleted from the Lync 2010 Topology a long time ago so I\u0026rsquo;m not sure why it is still referenced. As you can see this has the same Identity as the error on the Lync 2013 FE server (Failed to read pool FQDN associated with conference directory 11). To resolve this I deleted the BackCompatSite Conference Directory by running the command below (where 11 is the Identity of the Conference Directory I want to delete):\nRemove-CsConferenceDirectory -Identity 11 -Force After I restarted the Lync 2013 FE server, users were able to create and join conferences. The meeting options in Outlook, Dial-in conferencing settings page and dial-in conference ID\u0026rsquo;s all worked too. Looks like Lync 2010 was fine with this old BackCompatSite Conference Directory, but Lync 2013 wasn\u0026rsquo;t!\n","permalink":"https://chrishayward.co.uk/2013/04/10/lync-2013-conference-error/","summary":"\u003cp\u003eAfter deploying a Lync 2013 pool alongside an existing Lync 2010 deployment, users were unable to join conferences created by users registered on the 2013 pool. They would get the error \u0026ldquo;Conference Error\u0026rdquo;. This affected users who were moved from the 2010 pool and new users created on the 2013 pool.\u003c/p\u003e\n\u003cp\u003eWhen trying to change the Lync meeting options in Outlook or trying to reset the Assigned Conference Information via the Dial-in conference settings page it would generate an error.\u003c/p\u003e","title":"Lync 2013 – Conference Error"},{"content":"I recently started building a Lync 2013 Pilot Pool alongside my Lync 2010 deployment. When publishing the topology I got the following errors:\n_Publishing in progress\n_\n_Failed adding \u0026ldquo;AccessWrite\u0026rdquo; permissions for \u0026ldquo;RTCComponentUniversalServices\u0026rdquo;\nFailed adding \u0026ldquo;AccessRead\u0026rdquo; permissions for \u0026ldquo;RTCComponentUniversalServices\u0026rdquo;\nFailed adding \u0026ldquo;AccessWrite\u0026rdquo; permissions for \u0026ldquo;RTCHSUniversalServices\u0026rdquo;\nFailed adding \u0026ldquo;AccessRead\u0026rdquo; permissions for \u0026ldquo;RTCHSUniversalServices\u0026rdquo;\nFailed adding \u0026ldquo;AccessWrite\u0026rdquo; permissions for \u0026ldquo;RTCUniversalServerAdmins\u0026rdquo;\nFailed adding \u0026ldquo;AccessRead\u0026rdquo; permissions for \u0026ldquo;RTCUniversalServerAdmins\u0026rdquo;\n_\n_Access control list (ACL) might fail on UNIX file shares. Refer to the deployment guide to manually set the ACLs in the file share.\n_\nWhen the Publishing wizard is complete you see the error:\n_Enabling Topology… Completed with errors\n_\nWhen you view the log file you see the following errors for the Lync File Share:\nACLError: Access permissions error.\nError: Failed to save permissions on \u0026ldquo;\\server.domain.localLyncFS$\u0026rdquo;.\nUpdated Fix: When running Topology Builder, right click and \u0026ldquo;Run As Administrator\u0026rdquo;. Thanks to Dave in the comments below.\nTo fix this I had to add the following groups to the Share (Not NTFS) permissions on the Lync File Share. I had to do this even though Everyone had Full Control on the Share Permissions. Topology Builder would fail publishing the topology until I added these groups on.\nRTCComponentUniversalServices\nRTCHSUniversalServices\nRTCUniversalServerAdmins\nAfter changing the Share permissions, the topology published successfully:\n","permalink":"https://chrishayward.co.uk/2013/03/19/lync-2013-enabling-topology-completed-with-errors/","summary":"\u003cp\u003eI recently started building a Lync 2013 Pilot Pool alongside my Lync 2010 deployment. When publishing the topology I got the following errors:\u003c/p\u003e\n\u003cp\u003e_Publishing in progress\u003cbr\u003e\n_\u003c/p\u003e\n\u003cp\u003e_Failed adding \u0026ldquo;AccessWrite\u0026rdquo; permissions for \u0026ldquo;RTCComponentUniversalServices\u0026rdquo;\u003cbr\u003e\nFailed adding \u0026ldquo;AccessRead\u0026rdquo; permissions for \u0026ldquo;RTCComponentUniversalServices\u0026rdquo;\u003cbr\u003e\nFailed adding \u0026ldquo;AccessWrite\u0026rdquo; permissions for \u0026ldquo;RTCHSUniversalServices\u0026rdquo;\u003cbr\u003e\nFailed adding \u0026ldquo;AccessRead\u0026rdquo; permissions for \u0026ldquo;RTCHSUniversalServices\u0026rdquo;\u003cbr\u003e\nFailed adding \u0026ldquo;AccessWrite\u0026rdquo; permissions for \u0026ldquo;RTCUniversalServerAdmins\u0026rdquo;\u003cbr\u003e\nFailed adding \u0026ldquo;AccessRead\u0026rdquo; permissions for \u0026ldquo;RTCUniversalServerAdmins\u0026rdquo;\u003cbr\u003e\n_\u003c/p\u003e\n\u003cp\u003e_Access control list (ACL) might fail on UNIX file shares. Refer to the deployment guide to manually set the ACLs in the file share.\u003cbr\u003e\n_\u003c/p\u003e","title":"Lync 2013 – Enabling Topology Completed With Errors"},{"content":"In this post I will cover how to deploy the Lync 2010 client with a CU (Cumulative Update) and MUI (Multilingual User Interface) pack. I used this method to deploy Lync 2010 with Microsoft SCCM.\nCreate a package source folder (e.g. Lync_2010_MUI_CU7, then download the following files place them into two subfolders named \u0026ldquo;32bit\u0026rdquo; and \u0026ldquo;64bit\u0026rdquo;:\n32bit Folder:\nLyncSetup.exe (Lync 2010 32bit setup file)\nLync.msp (Lync 2010 32bit CU - Download CU 7)\nLyncMUI_32bit.exe (Lync 2010 32bit MUI setup file - Download)\n64bit Folder:\nLyncSetup.exe (Lync 2010 64bit setup file)\nLync.msp (Lync 2010 64bit CU 6 update - Download CU 7)\nLyncMUI_64bit.exe (Lync 2010 64bit MUI setup file - Download)\nCreate the following Batch File named install.bat containing the code below and save it in the root of the package source folder:\n:: Batch file to install Lync 2010 Client with CU7 and MUI packs on 32 bit and 64 bit Windows :: Created by Shy IT, www.ShyIT.co.uk @echo off IF EXIST \u0026#34;C:PROGRAM FILES (x86)\u0026#34; (GOTO :x64) ELSE (GOTO :x86) :x86 :: ****Install for 32 BIT**** :: Install Lync 2010 Client \u0026#34;%~dp032bitLyncSetup.exe\u0026#34; /Install /Silent :: Install Lync CU7 msiexec /update \u0026#34;%~dp032bitlync.msp\u0026#34; /quiet :: Install Lync MUI \u0026#34;%~dp032bitLyncMUI_32bit.exe\u0026#34; /quiet /norestart GOTO :EOF :x64 :: ****Install for 64 BIT**** :: Install Lync 2010 Client \u0026#34;%~dp064bitLyncSetup.exe\u0026#34; /Install /Silent :: Install Lync CU7 msiexec /update \u0026#34;%~dp064bitlync.msp\u0026#34; /quiet :: Install Lync MUI \u0026#34;%~dp064bitLyncMUI_64bit.exe\u0026#34; /quiet /norestart GOTO :EOF You can then create a package within SCCM using the package source folder and create a program that runs install.bat. This will install Lync 2010 on 32bit and 64bit machines. You can of course split the 32 bit and 64 bit in to separate packages but this method suited my environment.\n","permalink":"https://chrishayward.co.uk/2013/03/05/script-install-of-lync-2010-client-with-a-cu-and-mui-pack/","summary":"\u003cp\u003eIn this post I will cover how to deploy the Lync 2010 client with a CU (Cumulative Update) and MUI (Multilingual User Interface) pack.  I used this method to deploy Lync 2010 with Microsoft SCCM.\u003c/p\u003e\n\u003cp\u003eCreate a package source folder (e.g. Lync_2010_MUI_CU7, then download the following files place them into two subfolders named \u0026ldquo;32bit\u0026rdquo; and \u0026ldquo;64bit\u0026rdquo;:\u003c/p\u003e\n\u003cp\u003e32bit Folder:\u003cbr\u003e\nLyncSetup.exe (Lync 2010 32bit setup file)\u003cbr\u003e\nLync.msp (Lync 2010 32bit CU - \u003ca href=\"http://support.microsoft.com/kb/2737155\" title=\"Download CU 7\"\u003eDownload CU 7\u003c/a\u003e)\u003cbr\u003e\nLyncMUI_32bit.exe (Lync 2010 32bit MUI setup file - \u003ca href=\"http://www.microsoft.com/en-gb/download/details.aspx?id=16366\" title=\"Lync 2010 32bit MUI\"\u003eDownload\u003c/a\u003e)\u003c/p\u003e","title":"Script install of Lync 2010 client with a CU and MUI pack"},{"content":"In this post I will cover how to hide Response Groups from the Lync Address Book. You can hide users by setting the msExchHideFromAddressLists value to TRUE either by using the Exchange Management Console or Exchange Management Shell (If you have MS Exchange). You can also hide contacts (e.g. Common Area Phones/Analogue Devices) by setting the same value to TRUE using adsiedit. Microsoft also provide a tool in the Lync Resource Kit called ABSConfig that lets you configure who to include in the Address Book files.\nTo hide Response Groups you can use the same msExchHideFromAddressLists value but you need to find the object in adsiedit which can be a bit tricky. In this example my Lync global AD settings are stored in the Configuration container but yours may be in the System container.\nSystem Container: CN=Application Contacts, CN=RTC Service, CN=Microsoft,CN=System,DC=domain,DC=local\nConfiguration Container: CN=Application Contacts, CN=RTC Service, CN=Services,CN=Configuration,DC=domain,DC=local\nOpen adsiedit (start \u0026gt; run \u0026gt; \u0026ldquo;adsiedit.msc\u0026rdquo;)\nOn a 2008 R2 server by default you won\u0026rsquo;t see the configuration partition in adsiedit\nRight click \u0026ldquo;Default naming context [dc.domain.local]\u0026rdquo; and click \u0026ldquo;Settings\u0026rdquo;.\nChange \u0026ldquo;Select a well known Naming Context:\u0026rdquo; to \u0026ldquo;Configuration\u0026rdquo;.\nExpand Services \u0026gt; RTC Service \u0026gt; Application Contacts\nAs you can see it is not easy to identify your response groups in the Application Contacts container. For each object if you right click and select properties you will see the Attribute Editor:\nTo identify which response group the object refers to find the \u0026ldquo;proxyAddress\u0026rdquo; value. This is the sip address of the Response Group. Once you have identified the Response Group you want to hide from the Address Book, find the value \u0026ldquo;msExchHideFromAddressLists\u0026rdquo; and set it to TRUE.\nThe Address Book process will update the Address Book files at a fixed time (pre-configured) or you can run Update-CSAddressbook. Clients update the Address Book every 24 hours so they should receive the new address book with the Response Group hidden.\n","permalink":"https://chrishayward.co.uk/2012/10/16/hiding-response-groups-from-address-book-lync-server-2010/","summary":"\u003cp\u003eIn this post I will cover how to hide Response Groups from the Lync Address Book. You can hide users by setting the msExchHideFromAddressLists value to TRUE either by using the Exchange Management Console or Exchange Management Shell (If you have MS Exchange). You can also hide contacts (e.g. Common Area Phones/Analogue Devices) by setting the same value to TRUE using adsiedit. Microsoft also provide a tool in the Lync Resource Kit called ABSConfig that lets you configure who to include in the Address Book files.\u003c/p\u003e","title":"Hiding Response Groups From Address Book – Lync Server 2010"},{"content":"It is important to backup your Lync environment so that you can restore service in the event of a disaster. The following Microsoft TechNet articles explain how to backup Lync Server 2010:\nhttp://technet.microsoft.com/en-us/library/hh202170 http://technet.microsoft.com/en-us/library/hh202171 In this article I would just like to share how I have simplified this process.\nBen Lye at onesimplescript.com has written an excellent script that enumerates your Lync Topology and backs up your Topology Configuration data, Location Information Service data, Response Group configuration data from all pools and persistent user data from all registrars. The script can be found here: http://www.onesimplescript.com/2012/05/automating-backups-of-lync-2010.html\nThe script requires the RgsImportExport.ps1 script in the Lync Resource Kit which you can download from here: http://www.microsoft.com/en-us/download/details.aspx?id=21165\nI have set up a scheduled task to run this script once per week on one of my Lync Front End servers. You can do this by:\nCreating a \u0026ldquo;LyncBackup\u0026rdquo; account in Active Directory and adding it to the \u0026ldquo;RTCUniversalServerAdmins\u0026rdquo; Group Grant LyncBackup \u0026ldquo;Log On As a Batch Job\u0026rdquo; on one of your FE servers in the Local Security Policy Create the following folders, c:LyncBackups and c:LyncBackupsBackups Place a copy of Ben Lye\u0026rsquo;s script into c:LyncBackups Create a Scheduled Task in Task Scheduler to run \u0026ldquo;powershell.exe C:LyncBackupsBackup-LyncConfig.ps1\u0026rdquo; Configure the Scheduled Task to run using the \u0026ldquo;LyncBackup\u0026rdquo; account and to run whether user is logged on or not. You should also backup the Lync SQL databases using the SQL Management Studio or a Third Party backup plugin and do a file system backup of all Lync Server file stores.\n","permalink":"https://chrishayward.co.uk/2012/05/22/how-to-backup-lync-server-2010/","summary":"\u003cp\u003eIt is important to backup your Lync environment so that you can restore service in the event of a disaster.  The following Microsoft TechNet articles explain how to backup Lync Server 2010:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"http://technet.microsoft.com/en-us/library/hh202170\"\u003ehttp://technet.microsoft.com/en-us/library/hh202170\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://technet.microsoft.com/en-us/library/hh202171\"\u003ehttp://technet.microsoft.com/en-us/library/hh202171\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eIn this article I would just like to share how I have simplified this process.\u003c/p\u003e\n\u003cp\u003eBen Lye at onesimplescript.com has written an excellent script that enumerates your Lync Topology and backs up your Topology Configuration data, Location Information Service data, Response Group configuration data from all pools and persistent user data from all registrars.  The script can be found here: \u003ca href=\"http://www.onesimplescript.com/2012/05/automating-backups-of-lync-2010.html\"\u003ehttp://www.onesimplescript.com/2012/05/automating-backups-of-lync-2010.html\u003c/a\u003e\u003c/p\u003e","title":"How to Backup Lync Server 2010"},{"content":"After upgrading (Migrating) an ESX 4.1 host to ESXi 5 in a vSphere cluster, the host had a HA error. When reconfiguring the Host for HA got the following error:\nCannot complete the configuration of the vSphere HA agent on the host. Misconfiguration in the host network setup.\nWhen expanding \u0026ldquo;Related Events\u0026rdquo; on the task there was the following message:\nHost xxxx.domain in cluster XYZ in Data Centre XYZ currently has no avaialble networks for vSphere HA Communication. The following networks are currently used by HA: Service Console.\nThis occurred because ESX has a service console port group for the service console IP address and a VMKernel port group for the VMotion IP address. ESXi has the Management IP address and VMotion IP address on the same port group. During the migration the \u0026ldquo;Service Console\u0026rdquo; port group was renamed to \u0026ldquo;Management Network\u0026rdquo;.\nThis was fixed by:\nRight clicking the cluster \u0026gt; Edit Settings Clicking vSphere HA Clicking Advanced Options Adding the following entry - Option: \u0026ldquo;das.allowNetwork1\u0026rdquo;, Value \u0026ldquo;Management Network\u0026rdquo; Note I already had an Option configred for \u0026ldquo;das.allowNetwork0\u0026rdquo;, Value \u0026ldquo;Service Console\u0026rdquo;\nSee VMWare KB article here: http://kb.vmware.com/selfservice/microsites/search.do?language=en_US\u0026amp;cmd=displayKC\u0026amp;externalId=1006541\n","permalink":"https://chrishayward.co.uk/2012/01/25/vmware-ha-error-when-upgrading-from-esx-4-1-to-esxi-5/","summary":"\u003cp\u003eAfter upgrading (Migrating) an ESX 4.1 host to ESXi 5 in a vSphere cluster, the host had a HA  error.  When reconfiguring the Host for HA got the following error:\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eCannot complete the configuration of the vSphere HA agent on the host. Misconfiguration in the host network setup.\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eWhen expanding \u0026ldquo;Related Events\u0026rdquo; on the task there was the following message:\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eHost xxxx.domain in cluster XYZ in Data Centre XYZ currently has no avaialble networks for vSphere HA Communication.  The following networks are currently used by HA: Service Console.\u003c/em\u003e\u003c/p\u003e","title":"VMWare – HA error when upgrading from ESX 4.1 to ESXi 5"},{"content":"This neat little tool will scan your Outlook contacts and suggested contacts and tell you who you may be able to federate with!\nDownload the tool from here:\nhttp://gallery.technet.microsoft.com/Who-Can-Federate-Tool-a9e00d23\n","permalink":"https://chrishayward.co.uk/2011/12/02/lync-who-can-federate-tool/","summary":"\u003cp\u003eThis neat little tool will scan your Outlook contacts and suggested contacts and tell you who you may be able to federate with!\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/wp-content/uploads/2011/12/wcf_tool.jpg\"\u003e\u003cimg alt=\"Who Can Federate Tool\" loading=\"lazy\" src=\"/wp-content/uploads/2011/12/wcf_tool.jpg\" title=\"Who Can Federate Tool\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eDownload the tool from here:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://gallery.technet.microsoft.com/Who-Can-Federate-Tool-a9e00d23\"\u003ehttp://gallery.technet.microsoft.com/Who-Can-Federate-Tool-a9e00d23\u003c/a\u003e\u003c/p\u003e","title":"Lync Tip: Who Can Federate Tool"},{"content":"Using the Get-CsUser cmdlet you can get information about Lync users in your organization.\nThe below powershell command exports Lync users, sip address, Enterprise Voice Enabled and Line URI to a CSV file.\nGet-Csuser | Select-Object DisplayName, SipAddress, EnterpriseVoiceEnabled, LineUri | Export-Csv -Path c:LyncUsers.csv ","permalink":"https://chrishayward.co.uk/2011/11/29/list-lync-users-with-lineuris-to-csv/","summary":"\u003cp\u003eUsing the Get-CsUser cmdlet you can get information about Lync users in your organization.\u003c/p\u003e\n\u003cp\u003eThe below powershell command exports Lync users, sip address, Enterprise Voice Enabled and Line URI to a CSV file.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-powershell\" data-lang=\"powershell\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eGet-Csuser\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"nb\"\u003eSelect-Object\u003c/span\u003e \u003cspan class=\"n\"\u003eDisplayName\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eSipAddress\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eEnterpriseVoiceEnabled\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eLineUri\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"nb\"\u003eExport-Csv\u003c/span\u003e \u003cspan class=\"n\"\u003e-Path\u003c/span\u003e \u003cspan class=\"n\"\u003ec:LyncUsers\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"py\"\u003ecsv\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"Lync Tip: List Lync users with LineURI's to CSV"},{"content":"Whilst signed into Microsoft Lync, you may notice an error at the bottom of the client \u0026ldquo;Cannot synchronize address book\u0026rdquo;. You are also unable to find new Lync users. To resolve this issue, you can force address book updates on the client:\nSign out of the Lync client and close the application from the system tray Browse to %USERPROFILE%AppDataLocalMicrosoftCommunicatorsip_username@sipdomain (Windows Vista/7) or %userprofile%Local SettingsApplication DataMicrosoftCommunicatorsip_ (Windows XP) Delete files named GalContacts.db and GalContacts.db.idx (you may notice the date stamp on these to be out of date) Add the following entry to the clients registry: 32bit Clients:\nWindows Registry Editor Version 5.00 [HKEY_CURRENT_USERSoftwarePoliciesMicrosoftCommunicator] “GalDownloadInitialDelay”=dword:00000000 64bit Clients:\nWindows Registry Editor Version 5.00 [HKEY_CURRENT_USERSoftwareWow6432NodePoliciesMicrosoftCommunicator] “GalDownloadInitialDelay”=dword:00000000 Sign back into Lync (it may take a few moments to recreate the GALContacts files again) The address book error should now be cleared and new Lync users will appear in the search UPDATE 05/09/2012\nI came across this error again today, but this time every user was experiencing the \u0026ldquo;Cannot synchronize address book\u0026rdquo; error in their Lync client. I tried to force my client to update the address book using the fix above but this did not work.\nI checked the event logs on all Lync servers but was unable to find an error relating to the address book service. I could see that the address book was being updated within the file store. I then tested the Address Book web service using the following PowerShell commands:\n$credentials = get-credential Test-CsAddressBookService –TargetFqdn pool.mydomain.com -UserCredential $credentials -UserSipAddress “sip:users.sipaddress@mydomain.com” This returned an error:\n_Result : Failure\n__Latency : 00:00:00\n_Error : ERROR - No response received for Web-Ticket service\nAfter trawling through various posts online which suggested re-submitting the Lync Topology, checking the File Store permissions, none of which worked. In the end a simple reboot of my Lync Front End server resolved the problem.\n","permalink":"https://chrishayward.co.uk/2011/04/14/lync-2010-error-cannot-synchronize-address-book/","summary":"\u003cp\u003eWhilst signed into Microsoft Lync, you may notice an error at the bottom of the client \u0026ldquo;Cannot synchronize address book\u0026rdquo;. You are also unable to find new Lync users. To resolve this issue, you can force address book updates on the client:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSign out of the Lync client and close the application from the system tray\u003c/li\u003e\n\u003cli\u003eBrowse to %USERPROFILE%AppDataLocalMicrosoftCommunicatorsip_username@sipdomain (Windows Vista/7) or %userprofile%Local SettingsApplication DataMicrosoftCommunicatorsip_ (Windows XP)\u003c/li\u003e\n\u003cli\u003eDelete files named GalContacts.db and GalContacts.db.idx (you may notice the date stamp on these to be out of date)\u003c/li\u003e\n\u003cli\u003eAdd the following entry to the clients registry:\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e32bit Clients:\u003c/p\u003e","title":"Lync 2010 – Error \"Cannot synchronize address book\""},{"content":"After moving Lync Server 2010 backend databases to a different location on your SQL servers drives you may encounter an error where the Lync client shows an error \u0026ldquo;Limited functionality is available due to outage\u0026rdquo;.\nThis occurs because after dettaching and attaching the databases in a new location you need to enable cross database chainging on the RTC and RTCDYN databases.\nsp_dboption \u0026#39;\u0026lt;dbname\u0026gt;\u0026#39;, \u0026#39;db chaining\u0026#39;, TRUE If you check the event logs on your Lync Front End servers you will notice the following errors and warnings:\nEvent ID: 32134 Failed to connect to back-end database. Lync Server will continuously attempt to reconnect to the back-end. While this condition persists, incoming messages will receive error responses. Back-end Server: SQLSERVERINSTANCE Database: rtc Connection string of: driver={SQL Server Native Client 10.0};Trusted_Connection=yes;AutoTranslate=no;server=SQLSERVERINSTANCE;database=rtc; Cause: Possible issues with back-end database. Resolution: Ensure the back-end is functioning correctly. Event ID: 32118 SQL server cross database chaining option is disabled for either rtc or rtcdyn database. This may be caused by attaching or restoring an existing database. Since this condition causes performance issues, database will not be acquired until the issue is resolve Back-end Server: SQLSERVERINSTANCE Database: rtc Connection string of:driver={SQL Server Native Client 10.0};Trusted_Connection=yes;AutoTranslate=no;server=SQLSERVERINSTANCE;database=rtc;Cause: Check the eventlog description. Resolution: Please enable cross database chaining option (using \u0026#34;sp_dboption \u0026#39;\u0026lt;dbname\u0026gt;\u0026#39;, \u0026#39;db chaining\u0026#39;, TRUE\u0026#34;) for both rtc and rtcdyn databases. Once this is done, Service will automatically reconnect to the backend. ","permalink":"https://chrishayward.co.uk/2011/03/28/lync-2010-database-move-limited-functionality-is-available-due-to-outage/","summary":"\u003cp\u003eAfter moving Lync Server 2010 backend databases to a different location on your SQL servers drives you may encounter an error where the Lync client shows an error \u0026ldquo;Limited functionality is available due to outage\u0026rdquo;.\u003c/p\u003e\n\u003cp\u003eThis occurs because after dettaching and attaching the databases in a new location you need to enable cross database chainging on the RTC and RTCDYN databases.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sql\" data-lang=\"sql\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003esp_dboption\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;\u0026lt;dbname\u0026gt;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;db chaining\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eTRUE\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eIf you check the event logs on your Lync Front End servers you will notice the following errors and warnings:\u003c/p\u003e","title":"Lync 2010 Database move – Limited functionality is available due to outage"},{"content":"When trying to move a user to a new Lync pool within the Lync Server Control Panel you may receive the error below:\n1 Error(s) - Failed while updating destination pool.\nIf you select the \u0026ldquo;Force\u0026rdquo; check box, you receive a different error:\n1 Error(s) - Active Directory operation failed on \u0026ldquo;domaincontroller.domain.com\u0026rdquo;. You cannot retry this operation: \u0026ldquo;Insufficient access rights to perform the operation\nThis error occurs when the user is a member (or has previously been a member) of a protected Active Directory group (e.g. Domain Admins). When a user is a member of a protected AD group, AD automatically removes security inheritance for that user. To be able to move the user in Lync you need to re-apply security inheritance on the users account.\nOpen Active Directory Users and Computers (ensure you are viewing advanced features \u0026ldquo;View - Advanced Features\u0026rdquo;) Open the user account properties for the user you want to move Open the \u0026ldquo;Security\u0026rdquo; tab Click the \u0026ldquo;Advanced\u0026rdquo; button Check \u0026ldquo;Allow inheritable permissions from the parent to propagate to this object and all child objects\u0026rdquo; Click \u0026ldquo;Apply\u0026rdquo; You should now be able to move the user to a new Lync 2010 pool. The AD AdminSDHolder will remove the inheritance from this user again so you need to move the user straight away.\nI encountered this error when moving users from an OCS 2007 R2 pool to a Lync 2010 pool.\n","permalink":"https://chrishayward.co.uk/2011/03/28/lync-2010-move-user-1-errors-failed-while-updating-destination-pool/","summary":"\u003cp\u003eWhen trying to move a user to a new Lync pool within the Lync Server Control Panel you may receive the error below:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/wp-content/uploads/2011/03/move_user_error1.jpg\"\u003e\u003cimg loading=\"lazy\" src=\"/wp-content/uploads/2011/03/move_user_error1.jpg\" title=\"Move_User_Error\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e1 Error(s) - Failed while updating destination pool.\u003c/p\u003e\n\u003cp\u003eIf you select the \u0026ldquo;Force\u0026rdquo; check box, you receive a different error:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/wp-content/uploads/2011/03/move_user_error_force1.jpg\"\u003e\u003cimg loading=\"lazy\" src=\"/wp-content/uploads/2011/03/move_user_error_force1.jpg\" title=\"Move_User_Error_Force\"\u003e\u003c/a\u003e\u003cbr\u003e\n1 Error(s) - Active Directory operation failed on \u0026ldquo;domaincontroller.domain.com\u0026rdquo;.  You cannot retry this operation: \u0026ldquo;Insufficient access rights to perform the operation\u003c/p\u003e\n\u003cp\u003eThis error occurs when the user is a member (or has previously been a member) of a protected Active Directory group (e.g. Domain Admins).  When a user is a member of a protected AD group, AD automatically removes security inheritance for that user.  To be able to move the user in Lync you need to re-apply security inheritance on the users account.\u003c/p\u003e","title":"Lync 2010 move user – 1 Error(s) Failed while updating destination pool"}]